python / python/mypy

List[Literal[...]] type being narrowed where it shouldn't be

Offen
#9,850 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-literal-types topic-type-narrowing
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

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Ö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

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.