[PEP 695] Incorrect Variance Computation with `Self | other` return type
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
In the example below, FloatScalar is contravariant in FloatT, but mypy thinks it is invariant
from typing import Self
class FloatScalar[FloatT]: # contravariant
def pow(self, arg: FloatT) -> Self | complex: ...
def upcast(arg: FloatScalar[object]) -> FloatScalar[float]:
return arg # ❌️ Incompatible return value type
https://mypy-play.net/?gist=e9e6d34bee57d1c799b71b0f0573175d
If we remove the union in the return type, inference seems to work as expected:
from typing import Self
class FloatScalar[FloatT]: # contravariant
def pow(self, arg: FloatT) -> Self: ...
def upcast(arg: FloatScalar[object]) -> FloatScalar[float]:
return arg # ✅️
https://mypy-play.net/?gist=b0a994e8dda1b85ce2a4cf26631f843e
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 der verlinkten mypy-play-Reproduktion und vergleiche die beiden Beispiele, bei denen das Hinzufügen von Self | complex die inferierte Varianz von FloatScalar ändert. Verfolge die Varianzberechnung für das PEP-695-Generikum und füge einen Regressionstest hinzu, der zeigt, dass FloatScalar[object] im Union-Fall als FloatScalar[float] akzeptiert wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers, devtools
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 42/100