Skip to content

Commit 6204365

Browse files
committed
Narrowing for final type objects
1 parent cbbf4c3 commit 6204365

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

mypy/typeops.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,10 @@ def is_singleton_identity_type(typ: ProperType) -> bool:
10041004
)
10051005
if isinstance(typ, LiteralType):
10061006
return typ.is_enum_literal() or isinstance(typ.value, bool)
1007+
if isinstance(typ, TypeType) and isinstance(typ.item, Instance) and typ.item.type.is_final:
1008+
return True
1009+
if isinstance(typ, CallableType) and typ.is_type_obj() and typ.type_object().is_final:
1010+
return True
10071011
return False
10081012

10091013

test-data/unit/check-python310.test

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3314,3 +3314,44 @@ def type_object(field_type: type[object]) -> str:
33143314
return "bar"
33153315
return ret
33163316
[builtins fixtures/dict.pyi]
3317+
3318+
3319+
[case testMatchFinalClass]
3320+
from typing import final, NoReturn
3321+
3322+
def assert_never(x: NoReturn) -> NoReturn: ...
3323+
3324+
class Types:
3325+
3326+
@final
3327+
class A:
3328+
pass
3329+
3330+
@final
3331+
class B:
3332+
pass
3333+
3334+
def foo(cls: type[Types.A | Types.B]) -> None:
3335+
match cls:
3336+
case Types.A:
3337+
reveal_type(cls) # N: Revealed type is "type[__main__.Types.A]"
3338+
case Types.B:
3339+
reveal_type(cls) # N: Revealed type is "type[__main__.Types.B]"
3340+
case _:
3341+
assert_never(cls)
3342+
3343+
3344+
class TypeTypes:
3345+
A: type[Types.A] = Types.A
3346+
B: type[Types.B] = Types.B
3347+
3348+
3349+
def bar(cls: type[Types.A | Types.B]) -> None:
3350+
match cls:
3351+
case TypeTypes.A:
3352+
reveal_type(cls) # N: Revealed type is "type[__main__.Types.A]"
3353+
case TypeTypes.B:
3354+
reveal_type(cls) # N: Revealed type is "type[__main__.Types.B]"
3355+
case _:
3356+
assert_never(cls)
3357+
[builtins fixtures/tuple.pyi]

0 commit comments

Comments
 (0)