Mypy fails to solve `tuple[int, *Ts, int]` as an `Iterable[T]`.
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
from typing import Iterable
def upcast[T](arg: Iterable[T]) -> Iterable[T]: return arg
def f[*Ts](padded_tuple: tuple[int, *Ts, int]) -> None:
as_iterable = upcast(padded_tuple) # Argument 1 to "upcast" has incompatible type
reveal_type(as_iterable) # "typing.Iterable[builtins.int]" ❌
For comparison, pyright predicts Code sample in pyright playground Iterable[int | Union[*Ts@demo]].
Since Union of TypeVarTuple is not specced yet, mypy should nevertheless probably fall back to something like Iterable[object] or Iterable[Any], but Iterable[int] is just wrong.
If the tuple is not padded, then mypy still falsely issues [arg-type], but at least the reveal_type is Iterable[Any]. https://mypy-play.net/?mypy=latest&python=3.12&enable-incomplete-feature=PreciseTupleTypes&gist=b3429973142b9a329d0fcc1dda8aabb2
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit den verlinkten mypy-play-Reproduktionen und vergleiche die Fälle mit und ohne Padding bei Tupeln. Verfolge die TypeVarTuple-Inferenz für den Aufruf von Iterable[T] und überprüfe das Ergebnis anhand des gemeldeten pyright-Verhaltens; fertig bedeutet: kein inkorrekter arg-type-Fehler und kein fälschlicherweise eingeengter Iterable[int]-Typ.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 38/100