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)

未關閉
#22,018 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

評估

難度
4/5
預估耗時
3-5 天
新手友好度
58/100
Issue 類型
缺陷
描述清晰度
基本清楚
活躍度
活躍
技術堆疊
python

研究方向

Start by running the f, f2, and f3 examples from the issue in the MyPy Playground and inspect how unpacked tuple types are matched. Compare the handling of *tuple[Any, ...] and *tuple[int, *tuple[Any, ...]] with the cited typing specification. Done means the intended unbounded behavior is confirmed or corrected, with regression coverage for the reported Tuple index out of range case.

由索引模型根據 Issue 內容生成。

描述

bug

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 https://github.com/python/mypy/issues/21998 (my own and potentially others, e.g. see below).

cc/ @00200200 as the intended behavior here would affect their PR at https://github.com/python/mypy/pull/22002 .

主要語言
Python
星號
20.6k
分支
3.3k
平均合併
1 天 9 小時
30 天內合併 PR
56

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

python/mypy 的其他 Issue

查看 python/mypy 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。