MyPy treats initialization of a variable as an assignment for variance checks for complex dictionary.
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
The problem is that when initializing a variable from a dictionary expression it treats the type as invariant, but in the case of initialialization, it is covariant.
Example:
CODES = {
"a": "b",
"c": "d",
"e": "f",
}
# MyPy rejects this
PATTERNS: dict[str, tuple[str | None, str | None]] = {
"1" + k: ((v + "1" if v else None), "x")
for (k, v) in CODES.items()
} | {
"2" + k: ((v + "2" if v else None), "x")
for (k, v) in CODES.items()
}
# But is OK with this:
X: str | None = "x"
PATTERNS2: dict[str, tuple[str | None, str | None]] = {
"1" + k: ((v + "1" if v else None), X)
for (k, v) in CODES.items()
} | {
"1" + k: ((v + "1" if v else None), X)
for (k, v) in CODES.items()
}
Both patterns should be OK.
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 damit, das bereitgestellte MyPy-Beispiel auszuführen, und vergleiche die Diagnosen für PATTERNS und PATTERNS2. Verfolge den Typprüfpfad für Dictionary-Ausdrücke in Kombination mit annotierter Initialisierung und Varianzprüfungen. Füge einen Regressionstest hinzu, der das Beispiel abdeckt; die Aufgabe ist abgeschlossen, wenn beide Patterns akzeptiert werden, ohne die Prüfung unabhängiger Varianz abzuschwächen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 38/100