Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2a51005

Browse files
committed
Extend partial None type exception to classmethods
1 parent c179d29 commit 2a51005

2 files changed

Lines changed: 25 additions & 0 deletions

File tree

mypy/semanal.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4782,6 +4782,10 @@ def analyze_member_lvalue(
47824782
self.type.names[lval.name] = SymbolTableNode(MDEF, v, implicit=True)
47834783
for func in self.scope.functions:
47844784
func.def_or_infer_vars = True
4785+
4786+
if self.is_self_member_ref(lval) or self.is_cls_member_ref(lval):
4787+
assert self.type, "Self or cls member outside a class"
4788+
cur_node = self.type.names.get(lval.name)
47854789
if (
47864790
cur_node
47874791
and isinstance(cur_node.node, Var)
@@ -4799,6 +4803,13 @@ def is_self_member_ref(self, memberexpr: MemberExpr) -> bool:
47994803
node = memberexpr.expr.node
48004804
return isinstance(node, Var) and node.is_self
48014805

4806+
def is_cls_member_ref(self, memberexpr: MemberExpr) -> bool:
4807+
"""Does memberexpr to refer to an attribute of cls?"""
4808+
if not isinstance(memberexpr.expr, NameExpr):
4809+
return False
4810+
node = memberexpr.expr.node
4811+
return isinstance(node, Var) and node.is_cls
4812+
48024813
def check_lvalue_validity(self, node: Expression | SymbolNode | None, ctx: Context) -> None:
48034814
if isinstance(node, TypeVarExpr):
48044815
self.fail("Invalid assignment target", ctx)

test-data/unit/check-classes.test

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9727,3 +9727,17 @@ def f() -> None:
97279727
class X:
97289728
...
97299729
undefined # E: Name "undefined" is not defined
9730+
9731+
[case testPartialNoneTypeClassMethod]
9732+
# flags: --local-partial-types
9733+
9734+
class C:
9735+
x = None
9736+
9737+
@classmethod
9738+
def foo(cls) -> None:
9739+
if not cls.x:
9740+
cls.x = 1
9741+
9742+
reveal_type(C.x) # N: Revealed type is "builtins.int | None"
9743+
[builtins fixtures/classmethod.pyi]

0 commit comments

Comments
 (0)