Skip to content

Possible bug: *tuple[int, *tuple[Any, ...]] is not treated as unbounded like *tuple[*tuple[Any, ...]] is (and *tuple[Any, ...] by itself) (passes pyright 1.1.414 , pyrefly 1.3.1) #22018

Description

@willy-b

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 .

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrong

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions