`match-case` does not work correctly with Literals vs Enums
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
from enum import StrEnum
from typing import Literal, assert_never, reveal_type
class Color(StrEnum):
RED = "r"
GREEN = "g"
BLUE = "b"
def test_literal_as_enum(x: Literal["g"] = "g") -> None:
match x:
case Color.RED:
assert_never(x)
case Color.GREEN:
reveal_type(x)
case Color.BLUE:
assert_never(x)
case _:
assert_never(x)
def test_enum_as_litearl(y: Literal[Color.BLUE] = Color.BLUE) -> None:
match y:
case "r":
assert_never(y)
case "g":
assert_never(y)
case "b":
reveal_type(y)
case _:
assert_never(y)
test_literal_as_enum() # selects green branch at runtim
test_enum_as_litearl() # selects blue branch at runtime
Expected no errors, but mypy-playground reports
main.py:14: error: Statement is unreachable [unreachable]
main.py:18: error: Argument 1 to "assert_never" has incompatible type "Literal['g']"; expected "Never" [arg-type]
main.py:27: error: Statement is unreachable [unreachable]
main.py:29: error: Argument 1 to "assert_never" has incompatible type "Literal[Color.BLUE]"; expected "Never" [arg-type]
Related: https://discuss.python.org/t/amend-pep-586-to-make-enum-values-subtypes-of-literal/59456
Also: #16327, #17162, #19616 (but none of these is specifically about match-case)
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 gemeldeten Fehler im verknüpften mypy-playground-Beispiel mit aktiviertem Python 3.12, master und warn-unreachable zu reproduzieren. Verfolge anschließend die Eingrenzung von match-case für Literal-Strings und StrEnum-Mitglieder und verwende dann die gezeigten assert_never- und reveal_type-Prüfungen als Abschlusskriterien: Das Beispiel sollte keine Fehler erzeugen.
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
- 42/100