List[Literal[...]] type being narrowed where it shouldn't be
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
Adding an if check on a specific index of a List of Literals seems to narrow down its scope, even though the list can be modified and the value at that index can change.
To Reproduce
Run mypy over this piece of code:
foo: List[Literal['a', 'b']] = ['a', 'b', 'a']
if foo[0] == 'a':
print('a')
exit()
foo.pop(0)
reveal_type(foo[0])
if foo[0] == 'a':
pass
Expected Behavior
Revealed type to be Literal['a', 'b'], and the conditional to be valid.
Actual Behavior
t.py:11: note: Revealed type is 'Literal['b']'
t.py:12: error: Non-overlapping equality check (left operand type: "Literal['b']", right operand type: "Literal['a']")
Your Environment
- Mypy version used: 0.790
- Mypy command-line flags:
--strict - Python version used: 3.9.1 64-bit
- Operating system and version: Fedora 33 x86_64
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, den bereitgestellten Python-Reproduzierer mit mypy 0.790 auszuführen, und untersuche das Verhalten der Typverengung für indizierte veränderliche Lists von Literals. Verfolge den Einstiegspunkt der Typverengung für foo[0] durch den Checker; abgeschlossen ist die Untersuchung, wenn reveal_type(foo[0]) nach pop(0) weiterhin Literal['a', 'b'] ergibt und die spätere Gleichheitsprüfung akzeptiert wird.
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
- 42/100