Skip to content

[1.12, 1.13] Regression in enum narrowing #18029

Open
@Fred-si

Description

@Fred-si

Bug Report

Regression in 1.12.

Try to narrowing union between StrEnum (or IntEnum) and Literal no longer works since mypy 1.12.0

To Reproduce
Issue can be reproduce with this code sample

from typing_extensions import Literal
from typing import Union
from enum import StrEnum

class Foo(StrEnum):
    FOO = 'a'


def foo(a: Union[Foo, Literal['foo']]) -> Foo:
    if a == 'foo':
        return Foo.FOO

    return a

playground link
failing test can be found here

Expected Behavior
After the if branch return, variable type should be narrowed to Foo and mypy should not produce error

Actual Behavior
After the if branch return, variable type is considered as "Union[Foo, Literal['foo']]" and my

Your Environment

  • Mypy version used: 1.12, 1.13, master
  • Mypy command-line flags: none
  • Mypy configuration options from mypy.ini (and other config files): none
  • Python version used: all versions from 3.8 to 3.13

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions