python / python/mypy

Mypy fails to infer type parameters when composing generic functions with themselves

Offen
#18,864 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-type-variables
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

Mypy incorrectly infers Never types when the same generic function is used in multiple argument positions of a higher-order generic function, preventing proper composition of identical generic functions.

To Reproduce

from collections.abc import Callable

def compose[A, B, C](first: Callable[[A], B], second: Callable[[B], C]) -> Callable[[A], C]: ...

def id[T](value: T) -> list[T]: ...  # any generic would do

compose(id, id)
# Argument 1 to "compose" has incompatible type "Callable[[T], list[T]]"; expected "Callable[[Never], Never]"
# Argument 2 to "compose" has incompatible type "Callable[[T], list[T]]"; expected "Callable[[Never], Never]"

Expected Behavior

  1. The first id function should be inferred as Callable[[T], list[T]]
  2. The second id function should be inferred as Callable[[list[T]], list[list[T]]]
  3. The resulting composition should be Callable[[T], list[list[T]]]

Actual Behavior

Mypy fails to infer type parameters.

Your Environment

  • Mypy version used: 1.15.0
  • Mypy command-line flags: --strict
  • Mypy configuration options from mypy.ini (and other config files): none
  • Python version used: 3.13

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 damit, das Beispiel compose(id, id) mit mypy 1.15.0, Python 3.13 und --strict zu reproduzieren. Verfolge die Inferenz generischer Typen für die beiden Callable-Argumentpositionen; abgeschlossen ist die Aufgabe, wenn der erwartete verschachtelte Callable-Typ ohne Never-Fehler inferiert wird und ein Regressionstest diesen Fall abdeckt.

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
Klar beschrieben
Anfängerfreundlichkeit
38/100

Neue Issues direkt in Ihr Postfach

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