Repository navigation
inspect: getmembers calls properties #82518
Description
Activity
When calling inspect.getmembers on a class that has a property (@Property), the property will be called by the getattr call in getmembers.
Example:
import inspect class Example: def __init__(self, var): self._var = var print('__init__') def foo(self, bar): print(bar) print('foo') @property def var(self): print('Access property') return self._var if __name__ == '__main__': ex = Example('Hello') print('--- getmembers from instance ---') print(inspect.getmembers(ex)) print('--- getmembers from class ---') print(inspect.getmembers(Example))
Result:
__init__
--- getmembers from instance ---
Access property
[('__class__', <attribute '__class__' of 'object' objects>), ..., ('var', 'Hello')]
--- getmembers from class ---
[('__class__', <attribute '__class__' of 'object' objects>), ..., ('var', <property object at 0x...>)]Expected:
__init__
--- getmembers from instance ---
[('__class__', <attribute '__class__' of 'object' objects>), ..., ('var', <property object at 0x...>)]
--- getmembers from class ---
[('__class__', <attribute '__class__' of 'object' objects>), ..., ('var', <property object at 0x...>)]Reacted by Zachary- added3.7 (EOL)end of lifeend of life3.8 (EOL)end of lifeend of life3.9 (EOL)end of lifeend of lifestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Oct 1, 2019 the issue happens in 2.7 as well
The results of this example are different from mine(version 3.7.4).
__init__ --- getmembers from instance --- Access property [('__class__', <class '__main__.Example'>), ... ('var', 'Hello')] --- getmembers from class --- [('__class__', <class 'type'>),'var', <property object at 0x>)]The results of this example are different from mine(version 3.7.4)
I do not really see any difference. What do you mean?
I mean why member
__class__is expected to be<attribute '__class__'...>). I check PR16521,for class, it always gets<attribute '__class__'...>).Oh, yes I see what you mean. That's my fault, it seems like I copied the wrong line. Sorry.
But the important piece is the 'var' attribute. Sorry for the confusion.
Here is a link to the discussion of this on ideas:
https://discuss.python.org/t/implement-inspect-getmembers-static/2550Here is a link to the discussion of this on ideas
Thank you for posting the link.
I feel like I came to a dead end with this issue. As I am fairly new to CPython and have never contributed to this project before, I have no idea how to address this and to whom. Maybe this is just to irrelevant and not important, but even then we should probably close this issue or mark it as "indefinitely postponed" or something similar.
I'm still thinking about this bug/issue/undefined behaviour. Today I wanted to test its behaviour with async:
import inspect class Foo: def __init__(self, bar): self._bar = bar
@property async def spam(self): print('Called spam') return self._barif __name__ == '__main__': instance = Foo('eggs') members = inspect.getmembers(instance)
This will result in a RuntimeWarning:
RuntimeWarning: coroutine 'Foo.spam' was never awaited
members = inspect.getmembers(instance)
RuntimeWarning: Enable tracemalloc to get the object allocation tracebackSure, async properties might not be particularly beautiful or best-practice, but I frequently stumble upon code where getmembers would fail – just like this example. However, I am still clueless about what to do.
Looks like this is still around with at least 3.12. Not a popular bug :)
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsNo status
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields: