Skip to content

Commit a957403

Browse files
committed
fix
1 parent 04919a2 commit a957403

File tree

3 files changed

+45
-8
lines changed

3 files changed

+45
-8
lines changed

mypy/checker.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8324,9 +8324,28 @@ def conditional_types(
83248324
)
83258325
for union_item in get_proper_types(proper_type.items)
83268326
]
8327-
# separate list of tuples into two lists
8328-
yes_types, no_types = zip(*result)
8329-
proposed_type = make_simplified_union([t for t in yes_types if t is not None])
8327+
yes_items: list[Type] | None = []
8328+
no_items: list[Type] | None = []
8329+
for union_item in proper_type.items:
8330+
yes_type, no_type = conditional_types(
8331+
union_item,
8332+
proposed_type_ranges,
8333+
default=union_item,
8334+
consider_runtime_isinstance=consider_runtime_isinstance,
8335+
consider_promotion_overlap=consider_promotion_overlap,
8336+
)
8337+
if yes_type is None:
8338+
yes_items = None
8339+
elif yes_items is not None:
8340+
yes_items.append(yes_type)
8341+
if no_type is None:
8342+
no_items = None
8343+
elif no_items is not None:
8344+
no_items.append(no_type)
8345+
8346+
proposed_type = make_simplified_union(yes_items) if yes_items is not None else None
8347+
remaining_type = make_simplified_union(no_items) if no_items is not None else None
8348+
return proposed_type, remaining_type
83308349
else:
83318350
proposed_items = [type_range.item for type_range in proposed_type_ranges]
83328351
proposed_type = make_simplified_union(proposed_items)

test-data/unit/check-isinstance.test

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,20 +1407,30 @@ def f(x: Union[A, B]) -> None:
14071407
# flags: --warn-unreachable
14081408
from typing import Union
14091409

1410-
class FloatLike: pass
1411-
class IntLike(FloatLike): pass
1412-
14131410
def f1(x: Union[float, int]) -> None:
14141411
# We ignore promotions in isinstance checks
14151412
if isinstance(x, float):
14161413
reveal_type(x) # N: Revealed type is "builtins.float"
14171414
else:
14181415
reveal_type(x) # N: Revealed type is "builtins.int"
14191416

1417+
class FloatLike: pass
1418+
class IntLike(FloatLike): pass
1419+
14201420
def f2(x: Union[FloatLike, IntLike]) -> None:
1421-
# ...but not regular subtyping relationships
14221421
if isinstance(x, FloatLike):
1423-
reveal_type(x) # N: Revealed type is "__main__.FloatLike | __main__.IntLike"
1422+
reveal_type(x) # N: Revealed type is "__main__.FloatLike"
1423+
else:
1424+
reveal_type(x) # E: Statement is unreachable
1425+
1426+
class FloatLike2: pass
1427+
class IntLike2: pass
1428+
1429+
def f3(x: Union[FloatLike2, IntLike2]) -> None:
1430+
if isinstance(x, FloatLike2):
1431+
reveal_type(x) # N: Revealed type is "__main__.FloatLike2"
1432+
else:
1433+
reveal_type(x) # N: Revealed type is "__main__.IntLike2"
14241434
[builtins fixtures/isinstance.pyi]
14251435

14261436
[case testIsinstanceOfSuperclass]

test-data/unit/check-narrowing.test

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3523,6 +3523,14 @@ def f3(number: float | int, five: Literal[5]):
35233523
reveal_type(number) # N: Revealed type is "builtins.float | Literal[5]"
35243524
reveal_type(five) # N: Revealed type is "Literal[5]"
35253525

3526+
def f8(number: float | Literal[5], five: Literal[5]):
3527+
if number == five:
3528+
reveal_type(number) # N: Revealed type is "builtins.float | Literal[5]"
3529+
reveal_type(five) # N: Revealed type is "Literal[5]"
3530+
else:
3531+
reveal_type(number) # N: Revealed type is "builtins.float"
3532+
reveal_type(five) # N: Revealed type is "Literal[5]"
3533+
35263534
def f4(number: float | None, i: int):
35273535
if number == i:
35283536
reveal_type(number) # N: Revealed type is "builtins.float"

0 commit comments

Comments
 (0)