mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
PyObject_Dir(): Merge in __members__ and __methods__ too (if they exist,
and are lists, and then just the string elements (if any)). There are good and bad reasons for this. The good reason is to support dir() "like before" on objects of extension types that haven't migrated to the class introspection API yet. The bad reason is that Python's own method objects are such a type, and this is the quickest way to get their im_self etc attrs to "show up" via dir(). It looks much messier to move them to the new scheme, as their current getattr implementation presents a view of their attrs that's a untion of their own attrs plus their im_func's attrs. In particular, methodobject.__dict__ actually returns methodobject.im_func.__dict__, and if that's important to preserve it doesn't seem to fit the class introspection model at all.
This commit is contained in:
parent
bc7e863ce2
commit
305b5857f6
2 changed files with 53 additions and 0 deletions
|
@ -190,6 +190,7 @@ def test_dir():
|
|||
|
||||
cstuff = ['Cdata', 'Cmethod', '__doc__', '__module__']
|
||||
verify(dir(C) == cstuff)
|
||||
verify('im_self' in dir(C.Cmethod))
|
||||
|
||||
c = C() # c.__doc__ is an odd thing to see here; ditto c.__module__.
|
||||
verify(dir(c) == cstuff)
|
||||
|
@ -197,6 +198,7 @@ def test_dir():
|
|||
c.cdata = 2
|
||||
c.cmethod = lambda self: 0
|
||||
verify(dir(c) == cstuff + ['cdata', 'cmethod'])
|
||||
verify('im_self' in dir(c.Cmethod))
|
||||
|
||||
class A(C):
|
||||
Adata = 1
|
||||
|
@ -204,8 +206,10 @@ def test_dir():
|
|||
|
||||
astuff = ['Adata', 'Amethod'] + cstuff
|
||||
verify(dir(A) == astuff)
|
||||
verify('im_self' in dir(A.Amethod))
|
||||
a = A()
|
||||
verify(dir(a) == astuff)
|
||||
verify('im_self' in dir(a.Amethod))
|
||||
a.adata = 42
|
||||
a.amethod = lambda self: 3
|
||||
verify(dir(a) == astuff + ['adata', 'amethod'])
|
||||
|
@ -224,10 +228,12 @@ def test_dir():
|
|||
|
||||
c = C()
|
||||
verify(interesting(dir(c)) == cstuff)
|
||||
verify('im_self' in dir(C.Cmethod))
|
||||
|
||||
c.cdata = 2
|
||||
c.cmethod = lambda self: 0
|
||||
verify(interesting(dir(c)) == cstuff + ['cdata', 'cmethod'])
|
||||
verify('im_self' in dir(c.Cmethod))
|
||||
|
||||
class A(C):
|
||||
Adata = 1
|
||||
|
@ -235,11 +241,13 @@ def test_dir():
|
|||
|
||||
astuff = ['Adata', 'Amethod'] + cstuff
|
||||
verify(interesting(dir(A)) == astuff)
|
||||
verify('im_self' in dir(A.Amethod))
|
||||
a = A()
|
||||
verify(interesting(dir(a)) == astuff)
|
||||
a.adata = 42
|
||||
a.amethod = lambda self: 3
|
||||
verify(interesting(dir(a)) == astuff + ['adata', 'amethod'])
|
||||
verify('im_self' in dir(a.Amethod))
|
||||
|
||||
# Try a module subclass.
|
||||
import sys
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue