Skip to content

Faulty type inference for Enum attributes #15454

Closed

Description

@harahu

Bug Report

Accessing an instance of an enum though another instance leads to the wrong type being inferred for the instance.

To Reproduce

See: https://mypy-play.net/?mypy=master&python=3.12&flags=disallow-any-unimported&gist=26f57e606e831442885c45110b8d8650

import enum

class Color(enum.Enum):
    RED = "RED"
    GREEN = "GREEN"
    BLUE = "BLUE"

c = Color.RED

# error: Incompatible types in assignment (expression has type "str", variable has type "Color")  [assignment]
c = c.GREEN

Expected Behavior

I expect mypy to understand that c.GREEN is also of type Color.

Actual Behavior

Mypy thinks c.GREEN is of type str.

main.py:11: error: Incompatible types in assignment (expression has type "str", variable has type "Color")  [assignment]
Found 1 error in 1 file (checked 1 source file)

Your Environment

  • Mypy version used: master (post 1.3.0 at time of writing)
  • Mypy command-line flags: n/a
  • Mypy configuration options from mypy.ini (and other config files): n/a
  • Python version used: 3.12

Activity

  1. blbelew commented on Jun 26, 2023

    @blbelew

    This is affecting me as well, but triggering a "Statement is unreachable" error when warn_unreachable = True is in my mypy.ini. Consider the following (using the previous color enum):

    import enum
    
    class Color(enum.Enum):
        RED = "RED"
        GREEN = "GREEN"
        BLUE = "BLUE"
    
    def test(c:Color) -> str:
        if c == c.RED:
            return "it's red"
        if c == c.GREEN:
            return "it's green"
        if c == c.BLUE:
            return "it's blue"
    
        return "unknown color"
    

    MyPy 1.3.0 doesn't complain about this code, but MyPy 1.4.0 gives "Statement is unreachable" errors for each of the three conditional returns.

  2. added a commit that references this issue on Aug 3, 2025
    9d3a052
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions