python / python/mypy

Mypy fails to solve `tuple[int, *Ts, int]` as an `Iterable[T]`.

Offen
#19,659 0 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-pep-646
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]" ❌

https://mypy-play.net/?mypy=latest&python=3.12&enable-incomplete-feature=PreciseTupleTypes&gist=ed0d06b3234441ebf6f31b98224618fc

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

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Ö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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.