Clarify the valid use locations of `typing.Concatenate`
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 38/100
- Issue-Typ
- Dokumentation
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- python
- Bereich
- documentation
Rechercherichtung
Beginne mit dem Abschnitt zu benutzerdefinierten generischen Klassen in der typing-Spezifikation und der CPython-Dokumentation zu typing.Concatenate; vergleiche anschließend die Beispiele und das gemeldete Verhalten von mypy, pyright und ty. Prüfe die verknüpften Concatenate-Suchnotizen und ermittle, welche Verwendungsstellen gültig sind; abgeschlossen ist die Aufgabe, wenn die typing-Spezifikation und die CPython-Dokumentation die unterstützten Formen und die Einschränkung für verschachteltes Concatenate eindeutig beschreiben.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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
- Vorherrschende Sprache
- Python
- Sterne
- 1.8k
- Forks
- 302
- Ø Merge
- 23 Std.
- Gemergte PRs (30 T.)
- 8
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus python/typing
-
topic: typing spec
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
-
topic: typing spec
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
-
topic: documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
-
topic: documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
-
topic: conformance tests topic: typing spec
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 72/100
Ähnliche Issues
-
area: harness bug status: needs-triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
Human-Agent-Society/reef#625 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 80/100
learningequality/kolibri#15351 · 2 Kommentare ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
-
Name consistency Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
eellak/triplestore#65 · 1 Kommentar ·