Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

inspect: getmembers calls properties #82518

Open
jnsdrtlf mannequin opened this issue Oct 1, 2019 · 9 comments
Open

inspect: getmembers calls properties #82518

jnsdrtlf mannequin opened this issue Oct 1, 2019 · 9 comments
Labels
3.9 only security fixes stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error

Comments

@jnsdrtlf
Copy link
Mannequin

jnsdrtlf mannequin commented Oct 1, 2019

BPO 38337
Nosy @csabella, @hongweipeng, @jnsdrtlf
PRs
  • bpo-38337: Change getattr to inspect.getattr_static #16521
  • 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:

    assignee = None
    closed_at = None
    created_at = <Date 2019-10-01.12:01:59.088>
    labels = ['type-bug', 'library', '3.9']
    title = 'inspect: getmembers calls properties'
    updated_at = <Date 2020-03-29.19:22:40.724>
    user = 'https://github.com/jnsdrtlf'

    bugs.python.org fields:

    activity = <Date 2020-03-29.19:22:40.724>
    actor = 'jnsdrtlf'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = ['Library (Lib)']
    creation = <Date 2019-10-01.12:01:59.088>
    creator = 'jnsdrtlf'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 38337
    keywords = ['patch']
    message_count = 9.0
    messages = ['353688', '353698', '353871', '353872', '353895', '353900', '360715', '360748', '365274']
    nosy_count = 3.0
    nosy_names = ['cheryl.sabella', 'hongweipeng', 'jnsdrtlf']
    pr_nums = ['16521']
    priority = 'normal'
    resolution = None
    stage = 'patch review'
    status = 'open'
    superseder = None
    type = 'behavior'
    url = 'https://bugs.python.org/issue38337'
    versions = ['Python 3.9']

    @jnsdrtlf
    Copy link
    Mannequin Author

    jnsdrtlf mannequin commented Oct 1, 2019

    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...>)]

    @jnsdrtlf jnsdrtlf mannequin added 3.7 (EOL) end of life 3.8 (EOL) end of life 3.9 only security fixes stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error labels Oct 1, 2019
    @s-sanjay
    Copy link
    Mannequin

    s-sanjay mannequin commented Oct 1, 2019

    the issue happens in 2.7 as well

    @hongweipeng
    Copy link
    Mannequin

    hongweipeng mannequin commented Oct 3, 2019

    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>)]
    

    @jnsdrtlf
    Copy link
    Mannequin Author

    jnsdrtlf mannequin commented Oct 3, 2019

    The results of this example are different from mine(version 3.7.4)

    I do not really see any difference. What do you mean?

    @hongweipeng
    Copy link
    Mannequin

    hongweipeng mannequin commented Oct 4, 2019

    I mean why member __class__ is expected to be <attribute '__class__'...>). I check PR16521,for class, it always gets <attribute '__class__'...>).

    @jnsdrtlf
    Copy link
    Mannequin Author

    jnsdrtlf mannequin commented Oct 4, 2019

    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.

    @csabella
    Copy link
    Contributor

    Here is a link to the discussion of this on ideas:
    https://discuss.python.org/t/implement-inspect-getmembers-static/2550

    @csabella csabella removed 3.7 (EOL) end of life 3.8 (EOL) end of life labels Jan 26, 2020
    @jnsdrtlf
    Copy link
    Mannequin Author

    jnsdrtlf mannequin commented Jan 27, 2020

    Here 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.

    @jnsdrtlf
    Copy link
    Mannequin Author

    jnsdrtlf mannequin commented Mar 29, 2020

    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._bar
    
    if __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 traceback

    Sure, 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.

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    3.9 only security fixes stdlib Python modules in the Lib dir type-bug An unexpected behavior, bug, or error
    Projects
    None yet
    Development

    No branches or pull requests

    1 participant