mirror of https://github.com/python/cpython
bpo-46103: Fix inspect.getmembers to only get __bases__ from class (GH-30147)
This commit is contained in:
parent
76dc047a0e
commit
691506f4e9
|
@ -540,23 +540,23 @@ def isabstract(object):
|
|||
return False
|
||||
|
||||
def _getmembers(object, predicate, getter):
|
||||
if isclass(object):
|
||||
mro = (object,) + getmro(object)
|
||||
else:
|
||||
mro = ()
|
||||
results = []
|
||||
processed = set()
|
||||
names = dir(object)
|
||||
# :dd any DynamicClassAttributes to the list of names if object is a class;
|
||||
# this may result in duplicate entries if, for example, a virtual
|
||||
# attribute with the same name as a DynamicClassAttribute exists
|
||||
try:
|
||||
for base in object.__bases__:
|
||||
for k, v in base.__dict__.items():
|
||||
if isinstance(v, types.DynamicClassAttribute):
|
||||
names.append(k)
|
||||
except AttributeError:
|
||||
pass
|
||||
if isclass(object):
|
||||
mro = (object,) + getmro(object)
|
||||
# add any DynamicClassAttributes to the list of names if object is a class;
|
||||
# this may result in duplicate entries if, for example, a virtual
|
||||
# attribute with the same name as a DynamicClassAttribute exists
|
||||
try:
|
||||
for base in object.__bases__:
|
||||
for k, v in base.__dict__.items():
|
||||
if isinstance(v, types.DynamicClassAttribute):
|
||||
names.append(k)
|
||||
except AttributeError:
|
||||
pass
|
||||
else:
|
||||
mro = ()
|
||||
for key in names:
|
||||
# First try to get the value via getattr. Some descriptors don't
|
||||
# like calling their __get__ (see bug #1785), so fall back to
|
||||
|
|
|
@ -1215,8 +1215,13 @@ class TestClassesAndFunctions(unittest.TestCase):
|
|||
@types.DynamicClassAttribute
|
||||
def eggs(self):
|
||||
return 'spam'
|
||||
class B:
|
||||
def __getattr__(self, attribute):
|
||||
return None
|
||||
self.assertIn(('eggs', 'scrambled'), inspect.getmembers(A))
|
||||
self.assertIn(('eggs', 'spam'), inspect.getmembers(A()))
|
||||
b = B()
|
||||
self.assertIn(('__getattr__', b.__getattr__), inspect.getmembers(b))
|
||||
|
||||
def test_getmembers_static(self):
|
||||
class A:
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Now :func:`inspect.getmembers` only gets :attr:`__bases__` attribute from
|
||||
class type. Patch by Weipeng Hong.
|
Loading…
Reference in New Issue