#1162154: inspect.getmembers() now skips attributes that raise AttributeError,

e.g. a __slots__ attribute which has not been set.
This commit is contained in:
Amaury Forgeot d'Arc 2009-01-13 23:39:22 +00:00
parent a18392a324
commit b54447f31c
3 changed files with 19 additions and 2 deletions

View file

@ -253,7 +253,10 @@ def getmembers(object, predicate=None):
Optionally, only return members that satisfy a given predicate."""
results = []
for key in dir(object):
value = getattr(object, key)
try:
value = getattr(object, key)
except AttributeError:
continue
if not predicate or predicate(value):
results.append((key, value))
results.sort()

View file

@ -91,6 +91,17 @@ class TestPredicates(IsTestBase):
self.assert_(inspect.isroutine(mod.spam))
self.assert_(inspect.isroutine([].count))
def test_get_slot_members(self):
class C(object):
__slots__ = ("a", "b")
x = C()
x.a = 42
members = dict(inspect.getmembers(x))
self.assert_('a' in members)
self.assert_('b' not in members)
class TestInterpreterStack(IsTestBase):
def __init__(self, *args, **kwargs):
unittest.TestCase.__init__(self, *args, **kwargs)

View file

@ -137,7 +137,10 @@ Core and Builtins
Library
-------
- Issue #1696199: Add collections.Counter() for rapid and convenient
- Issue #1162154: inspect.getmembers() now skips attributes that raise
AttributeError, e.g. a __slots__ attribute which has not been set.
- Issue #1696199: Add collections.Counter() for rapid and convenient
counting.
- Issue #3860: GzipFile and BZ2File now support the context manager protocol.