(🐞) No error for incorrect variance on parameter with generic type
Offen
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
from typing import TypeVar, Generic
T_in = TypeVar("T_in", contravariant=True)
T_out = TypeVar("T_out", covariant=True)
class AOut(Generic[T_out]): ...
class AIn(Generic[T_in]): ...
class BOut(Generic[T_out]):
def f(self, a_out: AOut[T_out]) -> None: ... # no error
class BIn(Generic[T_in]):
def f(self, a_out: AIn[T_in]) -> None: ... # no error
Mypy in real life
from typing import TypeVar, Generic, Callable
T_in = TypeVar("T_in", contravariant=True)
T_out = TypeVar("T_out", covariant=True)
class AOut(Generic[T_out]):
T: T_out
def f(self, fn: Callable[[], T_out]) -> None:
self.t = fn()
def dump(self) -> T_out:
return self.t
class AIn(Generic[T_in]):
t: T_in
def load(self, t: T_in) -> None:
self.t = t
def f(self, fn: Callable[[T_in], object]) -> None:
fn(self.t)
o1: AOut[int]
o: AOut[object] = o1
o.f(lambda: "")
o1.dump() + 1 # runtime error
i1: AIn[object]
i: AIn[int] = i1
i1.load("")
i.f(lambda x: x + 1) # runtime error
related: #734, #8191
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
Führe mypy für die beiden Reproduktionen im Issue aus und bestätige, dass die ungültigen Verwendungen von Variance keine Fehler erzeugen. Verfolge den Einstiegspunkt für die Prüfung der generischen Variance und füge einen Regressionstest hinzu, der sowohl kovariante als auch kontravariante Fälle abdeckt; abgeschlossen ist die Aufgabe, wenn mypy die erwarteten Fehler meldet, ohne gültige Verwendung von Variance zu beeinträchtigen.
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
- 35/100