Skip to content
Closed
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Lib/inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ def getmembers(object, predicate=None):
# like calling their __get__ (see bug #1785), so fall back to
# looking in the __dict__.
try:
value = getattr(object, key)
value = getattr_static(object, key)
# handle the duplicate key
if key in processed:
raise AttributeError
Expand Down
21 changes: 21 additions & 0 deletions Lib/test/test_inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -1191,6 +1191,27 @@ def f(self):
self.assertIn(('f', b.f), inspect.getmembers(b))
self.assertIn(('f', b.f), inspect.getmembers(b, inspect.ismethod))

def test_getmembers_static(self):
class Foo:
def __init__(bar):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use def __init__(self, bar): please.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oups 🤦‍♂ Fixed in commit b415224

self._bar = bar

@property
def bar(self):
# This property should not be called by getmembers
raise NotImplementedError

foobar = Foo(42)
try:
members = inspect.getmembers(foobar)
property_member = ('bar', inspect.getattr_static(foobar, 'bar'))
self.assertIn(property_member, members)
class_members = inspect.getmembers(Foo)
property_class_member = ('bar', inspect.getattr_static(Foo, 'bar'))
self.assertIn(property_member, class_members)
except NotImplementedError:
self.fail('getmembers() called property!')

def test_getmembers_VirtualAttribute(self):
class M(type):
def __getattr__(cls, name):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Prevent :func:`inspect.getmembers` from calling descriptors.