Error with TypeVar with constraints on field initialization
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
The following example fails to type-check with mypy and pyright, but succeeds with ty:
from dataclasses import dataclass
from typing import TypeVar, Generic
class X:
pass
class Y(X):
pass
T = TypeVar("T", X, Y)
@dataclass
class C(Generic[T]):
v: T
def f(c: C[T]):
# no error with mypy and ty
# pyright reports an error on the argument
c.v = Y()
# no error with mypy and ty
# pyright reports an error on the assignment
d: C[T] = C(Y())
class M(Generic[T]):
# no error with ty
# mypy and pyright report an error on the assignment
c: C[T] = C(Y())
The constraints on T effectively make Y a lower bound for T, meaning that C(Y()) should be considered a valid C[T] for any allowed T. This seems to be correctly understood by mypy for field assignment and constructor assignment within a function, but not for field initialization at the class level.
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 dem minimalen Python-Beispiel im Issue und vergleiche, wie mypy Zuweisungen an eingeschränkte TypeVar während von Funktionskörpern im Vergleich zur Feldinitialisierung auf Klassenebene behandelt. Reproduziere die unterschiedlichen Ergebnisse von mypy, pyright und ty und ermittle anschließend, ob die Initialisierung auf Klassenebene C(Y()) für jedes zulässige T akzeptieren sollte, und füge eine Abdeckung für die gemeldeten Fälle hinzu.
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