mypy icon indicating copy to clipboard operation
mypy copied to clipboard

Faulty type inference for `Enum` attributes

Open harahu opened this issue 1 year ago • 1 comments

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

harahu avatar Jun 16 '23 14:06 harahu

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.

blbelew avatar Jun 26 '23 19:06 blbelew