-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
fix detection of whether MemberExpr.expr represents self/cls in…
#20480
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
Conversation
| [case testClassScopeImportAccessibleInMethods] | ||
| class A: | ||
| import mod | ||
| from mod import var | ||
|
|
||
| def __new__(cls) -> "A": | ||
| reveal_type(cls.mod) # N: Revealed type is "types.ModuleType" | ||
| reveal_type(cls.var) # N: Revealed type is "builtins.int" | ||
| reveal_type(cls.mod.var) # N: Revealed type is "builtins.int" | ||
| return cls() | ||
|
|
||
| def pos_or_named_self(self) -> None: | ||
| reveal_type(self.mod) # N: Revealed type is "types.ModuleType" | ||
| reveal_type(self.var) # N: Revealed type is "builtins.int" | ||
| reveal_type(self.mod.var) # N: Revealed type is "builtins.int" | ||
|
|
||
| def pos_only_self(self, /) -> None: | ||
| reveal_type(self.mod) # N: Revealed type is "types.ModuleType" | ||
| reveal_type(self.var) # N: Revealed type is "builtins.int" | ||
| reveal_type(self.mod.var) # N: Revealed type is "builtins.int" | ||
|
|
||
| @classmethod | ||
| def clsmethod(cls) -> None: | ||
| reveal_type(cls.mod) # N: Revealed type is "types.ModuleType" | ||
| reveal_type(cls.var) # N: Revealed type is "builtins.int" | ||
| reveal_type(cls.mod.var) # N: Revealed type is "builtins.int" | ||
|
|
||
| [file mod.py] | ||
| var = 1 | ||
| [builtins fixtures/module.pyi] | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
.mod.var was revealed to be Any in the body of __new__() and pos_only_self() before this PR. See e.g. mypy Playground for a reproducer:
class A:
import math
def __new__(cls) -> "A":
reveal_type(cls.math.pi) # N: Revealed type is "Any"
return cls()
def pos_or_named_self(self) -> None:
reveal_type(self.math.pi) # N: Revealed type is "builtins.float"
def pos_only_self(self, /) -> None:
reveal_type(self.math.pi) # N: Revealed type is "Any"
@classmethod
def clsmethod(cls) -> None:
reveal_type(cls.math.pi) # N: Revealed type is "builtins.float"|
According to mypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅ |
hauntsaninja
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, this is great!
…side methods
Fixes #20479.