summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-09-04 01:20:04 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-09-04 01:20:04 (GMT)
commit37a309db7086381da6ae176cec8817cdd75de872 (patch)
tree739ce41938274ff80e891d5589a7ebe29cc2d6cb /Lib
parenta8aefe535c879c8b0f5201961648a89c8e3d7887 (diff)
downloadcpython-37a309db7086381da6ae176cec8817cdd75de872.zip
cpython-37a309db7086381da6ae176cec8817cdd75de872.tar.gz
cpython-37a309db7086381da6ae176cec8817cdd75de872.tar.bz2
builtin_dir(): Treat classic classes like types. Use PyDict_Keys instead
of PyMapping_Keys because we know we have a real dict. Tolerate that objects may have an attr named "__dict__" that's not a dict (Py_None popped up during testing). test_descr.py, test_dir(): Test the new classic-class behavior; beef up the new-style class test similarly. test_pyclbr.py, checkModule(): dir(C) is no longer a synonym for C.__dict__.keys() when C is a classic class (looks like the same thing that burned distutils! -- should it be *made* a synoym again? Then it would be inconsistent with new-style class behavior.).
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_descr.py41
-rw-r--r--Lib/test/test_pyclbr.py2
2 files changed, 32 insertions, 11 deletions
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index ee924dc..dd411ac 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -183,8 +183,7 @@ def test_dir():
for arg in 2, 2L, 2j, 2e0, [2], "2", u"2", (2,), {2:2}, type, test_dir:
dir(arg)
- # Check some details here because classic classes aren't working
- # reasonably, and I want this to fail (eventually).
+ # Try classic classes.
class C:
Cdata = 1
def Cmethod(self): pass
@@ -202,23 +201,45 @@ def test_dir():
class A(C):
Adata = 1
def Amethod(self): pass
- astuff = ['Adata', 'Amethod', '__doc__', '__module__']
- # This isn't finding C's stuff at all.
+
+ astuff = ['Adata', 'Amethod'] + cstuff
verify(dir(A) == astuff)
- # But this is! It's because a.__class__ exists but A.__class__ doesn't.
a = A()
- verify(dir(a) == astuff[:2] + cstuff)
+ verify(dir(a) == astuff)
+ a.adata = 42
+ a.amethod = lambda self: 3
+ verify(dir(a) == astuff + ['adata', 'amethod'])
+
+ # The same, but with new-style classes. Since these have object as a
+ # base class, a lot more gets sucked in.
+ def interesting(strings):
+ return [s for s in strings if not s.startswith('_')]
- # The story for new-style classes is quite different.
class C(object):
Cdata = 1
def Cmethod(self): pass
+
+ cstuff = ['Cdata', 'Cmethod']
+ verify(interesting(dir(C)) == cstuff)
+
+ c = C()
+ verify(interesting(dir(c)) == cstuff)
+
+ c.cdata = 2
+ c.cmethod = lambda self: 0
+ verify(interesting(dir(c)) == cstuff + ['cdata', 'cmethod'])
+
class A(C):
Adata = 1
def Amethod(self): pass
- d = dir(A)
- for expected in 'Cdata', 'Cmethod', 'Adata', 'Amethod':
- verify(expected in d)
+
+ astuff = ['Adata', 'Amethod'] + cstuff
+ verify(interesting(dir(A)) == astuff)
+ a = A()
+ verify(interesting(dir(a)) == astuff)
+ a.adata = 42
+ a.amethod = lambda self: 3
+ verify(interesting(dir(a)) == astuff + ['adata', 'amethod'])
binops = {
'add': '+',
diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py
index e5de657..ce4d8ac 100644
--- a/Lib/test/test_pyclbr.py
+++ b/Lib/test/test_pyclbr.py
@@ -76,7 +76,7 @@ class PyclbrTest(unittest.TestCase):
self.assertListEq(real_bases, pyclbr_bases, ignore)
actualMethods = []
- for m in dir(py_item):
+ for m in py_item.__dict__.keys():
if type(getattr(py_item, m)) == MethodType:
actualMethods.append(m)
foundMethods = []