-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Description
Bug Report
Using isinstance(<Sequence[X]>, tuple) narrows the type of <Sequence[X]> to Tuple[Any, ...], not Tuple[X, ...] as one would expect.
To Reproduce
[mypy-play.net]
[pyright-play.net1] (pyright handles this as expected)
from __future__ import annotations
from typing_extensions import (
assert_type,
Sequence,
Tuple,
)
value: Sequence[str]
if isinstance(value, tuple):
assert_type(value, Tuple[str, ...])
# expected: (this works)
# actual: "Expression is of type 'tuple[Any, ...]',
# not 'tuple[str, ....]'"Expected Behavior
if instance(value, ...) should only ever narrow the type of value
Actual Behavior
Mypy narrows the container type, but forgets the element type
Your Environment
- Mypy version used: 1.8.0; bug exists back to at least 1.0
- Mypy command-line flags: (none)
- Mypy configuration options from
mypy.ini(and other config files): (none) - Python version used: 3.8, 3.12
Existing issues
While it seems extremely unlikely that this issue hasn't been reported, I haven't been able to locate anything obviously related among the ~217 issues that mention both isinstance and tuple. Issue #2456 may be vaguely related.
Footnotes
-
the pyright example code is slightly modified (1) to avoid an error around
valuebeing uninitialized, and (2) to reflect that pyright behaves as expected ↩