Skip to content

Commit 5727d33

Browse files
authored
Fix crash on invalid property inside its own body (#19208)
Fixes #19205
1 parent 4934c2b commit 5727d33

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
@@ -981,6 +981,10 @@ def expand_and_bind_callable(
981981
assert isinstance(expanded, CallableType)
982982
if var.is_settable_property and mx.is_lvalue and var.setter_type is not None:
983983
# TODO: use check_call() to infer better type, same as for __set__().
984+
if not expanded.arg_types:
985+
# This can happen when accessing invalid property from its own body,
986+
# error will be reported elsewhere.
987+
return AnyType(TypeOfAny.from_error)
984988
return expanded.arg_types[0]
985989
else:
986990
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)