Clarify the valid use locations of `typing.Concatenate`
維護者通常 1 天內回覆
還沒有人認領這個 Issue。
評估
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 新手友好度
- 38/100
- Issue 類型
- 文件
- 描述清晰度
- 基本清楚
- 活躍度
- 停滯
- 技術堆疊
- python
研究方向
從 typing 規範的使用者定義泛型類別部分和 CPython 關於 typing.Concatenate 的文件開始,然後比較 mypy、pyright 和 ty 的範例及回報的行為。檢視連結的 Concatenate 搜尋筆記,並確定哪些使用位置有效;完成的標準是 typing 規範和 CPython 文件清楚地描述支援的形式以及巢狀 Concatenate 限制。
由索引模型根據 Issue 內容生成。
描述
In python/cpython#142965, it was reported that the documentation of typing.Concatenate is "incorrect" (documentation that originates back to python/cpython#24000).
@A5rocks, in your example, Concatenate[int, P_2] somewhat finally lands as a first argument to Callable, just indirectly.
This snippet previously defined:
P_2 = ParamSpec("P_2")
class X(Generic[T, P]):
f: Callable[P, int]
x: T
Similar example is included in the typing spec:
https://typing.python.org/en/latest/spec/generics.html#user-defined-generic-classes
class X[T, **P]:
f: Callable[P, int]
x: T
# (...)
def accept_concatenate[**P](x: X[int, Concatenate[int, P]]) -> str: ... # Accepted
However, it seems that the current situation (confirmed with mypy, pyright and ty) is that you can use Concatenate in all valid locations of ParamSpec except directly in a Concatenate. I.e., you can't do Concatenate[int, Concatenate[str, P]]), but you can (besides passing Concatenate form as the first argument to Callable):
- Accumulate
Concatenates asParamSpecs
from collections.abc import Callable
from typing import Concatenate
type Y[**P] = Callable[Concatenate[int, P], None]
type X[**P] = Y[Concatenate[int, P]]
def foo(f: X[str]) -> None:
reveal_type(f)
# mypy: def (builtins.int, builtins.int, builtins.str)
# pyright: (int, int, str) -> None
# ty: (...) -> None
- Bind
Concatenates to user-defined generics asParamSpecs
class X[T, **P]:
f: Callable[P, int]
x: T
def accept_concatenate[**P](x: X[int, Concatenate[int, P]]) -> str: ...
- Use
Concatenateas a type argument totuple-- is this correct?
from typing import Concatenate
def c(t: tuple[Concatenate[int, ...]]) -> None:
reveal_type(c)
# mypy: def (t: tuple[[builtins.int, *Any, **Any]])
# pyright: (t: tuple[Concatenate[int, ...]]) -> None
# ty: def c(t: tuple[@Todo]) -> None
I've found this mostly by poking around -- I haven't analyzed the actual implementations (yet).
I'll continue to investigate this from these searches.
I think that the valid use locations of Concatenate should be clarified in the typing spec and then in the CPython docs.
Is there anything else I overlooked? CC @JelleZijlstra @AlexWaygood
- 主要語言
- Python
- 星號
- 1.8k
- 分支
- 302
- 平均合併
- 20 小時 26 分鐘
- 30 天內合併 PR
- 10
環境準備
我們還沒有檢查這個專案的環境設定檔。先看它的 README,通用步驟見我們的新手貢獻指南。
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
python/typing 的其他 Issue
-
topic: typing spec
難度 2/5 1-3 小時 新手友好度 72/100
python/typing#2356 · 2 則留言 · 1 個 reaction ·
維護者通常 1 天內回覆
-
topic: typing spec
難度 2/5 1-3 小時 新手友好度 75/100
維護者通常 1 天內回覆
-
topic: documentation
難度 2/5 1-3 小時 新手友好度 76/100
維護者通常 1 天內回覆
-
topic: documentation
難度 2/5 1-3 小時 新手友好度 65/100
python/typing#2150 · 2 則留言 · 2 個 reaction ·
維護者通常 1 天內回覆
-
topic: conformance tests topic: typing spec
難度 3/5 1-2 天 新手友好度 72/100
維護者通常 1 天內回覆
相似的 Issue
-
pydanty:is-working
難度 2/5 1-3 小時 新手友好度 78/100
pydantic/pydantic-ai#8843 ·
維護者通常 1 天內回覆
-
breaking change enhancement server
難度 2/5 1-3 小時 新手友好度 72/100
維護者通常 1 天內回覆
-
bug
難度 2/5 1-3 小時 新手友好度 88/100
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 72/100
維護者通常 1 天內回覆
-
needs-triage
難度 2/5 1-3 小時 新手友好度 85/100
維護者通常 1 天內回覆