pylint-dev/pylint

Dynamic `__getattr__` still leads to `no-member` if inference is ambiguous

Open

#9,833 opened on 2024年7月25日

GitHub で見る
 (5 comments) (0 reactions) (1 assignee)Python (4,978 stars) (1,059 forks)batch import
False Positive 🦟Good first issueHacktoberfestNeeds PR

説明

Bug description

"""
The following code should lint without errors, but pylint shows:
test.py:28:6: E1101: Instance of 'A' has no 'any' member (no-member)
"""
# pylint: disable=too-few-public-methods


class A:
    """class without attributes"""


class B:
    """class with any attribute"""
    def __getattr__(self, name):
        return None
    # uncomment to remove the error
    # any = 1


def a_or_b(p) -> A | B:
    """function, which may return an instance of A or B"""
    if p == "a":
        return A()
    return B()


x: B = a_or_b("b")  # we have annotated that x is an instance of B
print(x.any)  # pylint shows E1101 (no-member)

# this does not cause an error in any case
y = B()
print(y.any)

Configuration

No response

Command used

pylint test.py

Pylint output

************* Module test
test.py:28:6: E1101: Instance of 'A' has no 'any' member (no-member)

Expected behavior

no error

Pylint version

pylint 3.2.6
astroid 3.2.4
Python 3.10.12

OS / Environment

$ uname -a Linux xxx 5.15.0-112-generic #122-Ubuntu SMP Thu May 23 07:48:21 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

Additional dependencies

No response

コントリビューターガイド