Skip to content

Commit 0a4f284

Browse files
ilevkivskyiJukkaL
authored andcommitted
Fix crash on invalid property inside its own body (#19208)
Fixes #19205
1 parent 9b079f6 commit 0a4f284

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

mypy/checkmember.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,10 @@ def expand_and_bind_callable(
974974
assert isinstance(expanded, CallableType)
975975
if var.is_settable_property and mx.is_lvalue and var.setter_type is not None:
976976
# TODO: use check_call() to infer better type, same as for __set__().
977+
if not expanded.arg_types:
978+
# This can happen when accessing invalid property from its own body,
979+
# error will be reported elsewhere.
980+
return AnyType(TypeOfAny.from_error)
977981
return expanded.arg_types[0]
978982
else:
979983
return expanded.ret_type

test-data/unit/check-classes.test

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8726,3 +8726,16 @@ class Fields:
87268726
reveal_type(Fields.bool_f) # N: Revealed type is "__main__.BoolField"
87278727
reveal_type(Fields.int_f) # N: Revealed type is "__main__.NumField"
87288728
reveal_type(Fields.custom_f) # N: Revealed type is "__main__.AnyField[__main__.Custom]"
8729+
8730+
[case testRecursivePropertyWithInvalidSetterNoCrash]
8731+
class NoopPowerResource:
8732+
_hardware_type: int
8733+
8734+
@property
8735+
def hardware_type(self) -> int:
8736+
return self._hardware_type
8737+
8738+
@hardware_type.setter
8739+
def hardware_type(self) -> None: # E: Invalid property setter signature
8740+
self.hardware_type = None # Note: intentionally recursive
8741+
[builtins fixtures/property.pyi]

0 commit comments

Comments
 (0)