diff options
author | Tim Peters <tim.peters@gmail.com> | 2001-09-04 01:20:04 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2001-09-04 01:20:04 (GMT) |
commit | 37a309db7086381da6ae176cec8817cdd75de872 (patch) | |
tree | 739ce41938274ff80e891d5589a7ebe29cc2d6cb /Lib | |
parent | a8aefe535c879c8b0f5201961648a89c8e3d7887 (diff) | |
download | cpython-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.py | 41 | ||||
-rw-r--r-- | Lib/test/test_pyclbr.py | 2 |
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 = [] |