bpo-46103: Fix inspect.getmembers to only get __bases__ from class (GH-30147)

This commit is contained in:
Weipeng Hong 2022-01-24 01:40:38 +08:00 committed by GitHub
parent 76dc047a0e
commit 691506f4e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 14 deletions

View File

@ -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

View File

@ -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:

View File

@ -0,0 +1,2 @@
Now :func:`inspect.getmembers` only gets :attr:`__bases__` attribute from
class type. Patch by Weipeng Hong.