-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Closed
Labels
bugmypy got something wrongmypy got something wrong
Description
Bug Report
Applying TypeIs
to narrow type of an iterable results in too optimistic reachability analysis.
To Reproduce
from collections.abc import Iterable
from typing_extensions import TypeIs
def is_iterable_int(val: Iterable[object]) -> TypeIs[Iterable[int]]:
return all(isinstance(item, int) for item in val)
bar: list[int] | list[str]
if is_iterable_int(bar):
reveal_type(bar)
else:
reveal_type(bar)
playground has more code, including TypeGuard
comparison and non-iterable case that works correctly.
Expected Behavior
I'd expected both branches to be reachable and to narrow type according to the spec: list[int]
in if
and list[str]
in else
, ideally.
Actual Behavior
main.py:11: note: Revealed type is "builtins.list[builtins.int]"
main.py:13: error: Statement is unreachable [unreachable]
Your Environment
- Mypy version used: 1.10.0 and master (playground)
- Mypy command-line flags:
--warn-unreachable
- Mypy configuration options from
mypy.ini
(and other config files): N/A - Python version used: 3.11
tpvasconcelos
Metadata
Metadata
Assignees
Labels
bugmypy got something wrongmypy got something wrong