`match-case` does not work correctly with Literals vs Enums
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
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)
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia riproducendo gli errori segnalati nell'esempio mypy-playground collegato con Python 3.12, master e warn-unreachable abilitati. Traccia il narrowing di match-case per le stringhe Literal e i membri di StrEnum, quindi usa i controlli assert_never e reveal_type mostrati come criteri di completamento: l'esempio non dovrebbe produrre alcun errore.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 42/100