Hello MyPy team!
I am seeing error: Tuple index out of range [misc] in a case where it seems inappropriate (and it passes pyright 1.1.414 , pyrefly 1.3.1), where MyPy appears to be handling unpacked unbounded type tuples inconsistently:
*tuple[int, *tuple[Any, ...]] is not treated as unbounded like *tuple[*tuple[Any, ...]] is (and *tuple[Any, ...] by itself).
In the following example (try it online in the MyPy Playground at https://mypy-play.net/?gist=0ce2970c7a6472603d696e130beeabcc ),
f and f2 pass, but f3 fails MyPy with error: Tuple index out of range [misc]:
# e.g. python 3.12, mypy 2.3.1
# passes pyright 1.1.414 , pyrefly 1.3.1
from typing import Any
# see https://peps.python.org/pep-0646/#unpacking-unbounded-tuple-types#:~:text=Note%20that%20Tuple
# this one is handled properly
def f(*args: *tuple[*tuple[Any, ...]]) -> None:
reveal_type(args[0]) # Any
reveal_type(args[1]) # Any
# this is also handled properly
def f2(*args: *tuple[int, *tuple[Any, int]]) -> None:
reveal_type(args[1]) # Any
# but *args is not recognized as unbounded here?
# there seems to be general support for such forms for some kinds of type matching recognizing the unboundedness, see e.g. the example at https://web.archive.org/web/20260918002706/https://typing.python.org/en/latest/spec/generics.html#:~:text=type%20and%20a%20part%20of%20an%20arbitrary-length%20tuple
def f3(*args: *tuple[int, *tuple[Any, ...]]) -> None:
reveal_type(args[1]) # error: `Tuple index out of range [misc]`, seems it should be recognized as unbounded like in f, why is this considered ambiguous?
Thanks in advance!
It is also fine just to confirm the expected behavior without promising any fix, I would be happy to write test cases and attempt a fix myself. I am trying to understand the intended behavior here in part to evaluate solutions to #21998 (my own and potentially others, e.g. see below).
cc/ @00200200 as the intended behavior here would affect their PR at #22002 .
Hello MyPy team!
I am seeing
error: Tuple index out of range [misc]in a case where it seems inappropriate (and it passes pyright 1.1.414 , pyrefly 1.3.1), where MyPy appears to be handling unpacked unbounded type tuples inconsistently:*tuple[int, *tuple[Any, ...]]is not treated as unbounded like*tuple[*tuple[Any, ...]]is (and*tuple[Any, ...]by itself).In the following example (try it online in the MyPy Playground at https://mypy-play.net/?gist=0ce2970c7a6472603d696e130beeabcc ),
fandf2pass, butf3fails MyPy witherror: Tuple index out of range [misc]:Thanks in advance!
It is also fine just to confirm the expected behavior without promising any fix, I would be happy to write test cases and attempt a fix myself. I am trying to understand the intended behavior here in part to evaluate solutions to #21998 (my own and potentially others, e.g. see below).
cc/ @00200200 as the intended behavior here would affect their PR at #22002 .