pylint-dev/pylint
View on GitHubDynamic `__getattr__` still leads to `no-member` if inference is ambiguous
Open
#9,833 opened on Jul 25, 2024
False Positive 馃Good first issueHacktoberfestNeeds PR
Description
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