Skip to content

Commit 975d91a

Browse files
Merge branch 'master' into patch-3
2 parents c0f9bd2 + 1f339c0 commit 975d91a

File tree

4 files changed

+45
-0
lines changed

4 files changed

+45
-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]

test-data/unit/check-dataclasses.test

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2609,3 +2609,12 @@ class B2(B1): # E: A NamedTuple cannot be a dataclass
26092609
pass
26102610

26112611
[builtins fixtures/tuple.pyi]
2612+
2613+
[case testDataclassesTypeGuard]
2614+
import dataclasses
2615+
2616+
raw_target: object
2617+
2618+
if isinstance(raw_target, type) and dataclasses.is_dataclass(raw_target):
2619+
reveal_type(raw_target) # N: Revealed type is "type[dataclasses.DataclassInstance]"
2620+
[builtins fixtures/tuple.pyi]

test-data/unit/check-typeguard.test

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,3 +777,22 @@ def handle(model: Model) -> int:
777777
return process_model(model)
778778
return 0
779779
[builtins fixtures/tuple.pyi]
780+
781+
782+
[case testOverloadedTypeGuardType]
783+
from __future__ import annotations
784+
from typing_extensions import TypeIs, Never, overload
785+
786+
class X: ...
787+
788+
@overload # E: An overloaded function outside a stub file must have an implementation
789+
def is_xlike(obj: Never) -> TypeIs[X | type[X]]: ... # type: ignore
790+
@overload
791+
def is_xlike(obj: type) -> TypeIs[type[X]]: ...
792+
@overload
793+
def is_xlike(obj: object) -> TypeIs[X | type[X]]: ...
794+
795+
raw_target: object
796+
if isinstance(raw_target, type) and is_xlike(raw_target):
797+
reveal_type(raw_target) # N: Revealed type is "type[__main__.X]"
798+
[builtins fixtures/tuple.pyi]

0 commit comments

Comments
 (0)