Final (context-sensitive Literal) doesn't support type narrowing
Offen
Dieses Issue hat noch niemand übernommen.
bug
topic-final
topic-literal-types
topic-type-narrowing
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- Ø Merge
- 1 T. 18 Std.
- Gemergte PRs (30 T.)
- 54
Beschreibung
Bug Report
Maybe there's a reason this is not supported, but at a quick look it seems like it should work. When a union of context-sensitive Literals are used, it fails to perform type narrowing, whereas explicit Literals do work.
To Reproduce
from typing import Final, Literal
class TXTRecord:
type: Final = "TXT"
text: str = "Foo"
class ARecord:
type: Final = "A"
host: str = "192.168.1.1"
record: TXTRecord | ARecord
reveal_type(record.type)
if record.type == "TXT":
print(record.text) # error with Final, but not with Literal
else:
print(record.host) # error with Final, but not with Literal
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, die bereitgestellte Python-Reproduktion auszuführen, und vergleiche ihr Narrowing-Verhalten mit dem entsprechenden expliziten Literal-Fall. Die Arbeit ist abgeschlossen, wenn die auf Final basierende Union in den beiden Zweigen zu TXTRecord und ARecord eingeengt wird, ohne die gemeldeten Attributfehler zu erzeugen.
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
- 45/100