- 
          
 - 
                Notifications
    
You must be signed in to change notification settings  - Fork 3k
 
Open
Labels
bugmypy got something wrongmypy got something wrongtopic-enumtopic-literal-typestopic-match-statementPython 3.10's match statementPython 3.10's match statement
Description
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 runtimeExpected 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)
Metadata
Metadata
Assignees
Labels
bugmypy got something wrongmypy got something wrongtopic-enumtopic-literal-typestopic-match-statementPython 3.10's match statementPython 3.10's match statement