python / mypy

Optional static typing for Python
https://www.mypy-lang.org/
Other
18.2k stars 2.78k forks source link

Not detecting `enum.auto` vs `enum.auto()` #17650

Open jamesbraza opened 1 month ago

jamesbraza commented 1 month ago

Bug Report

mypy is not detecting forgetting to call enum.auto() in IntEnum and StrEnum.

To Reproduce

from enum import IntEnum, StrEnum, auto

class SomeIntEnum(IntEnum):
    CORRECT_AUTO = auto()
    INCORRECT_AUTO = auto

reveal_type(SomeIntEnum.CORRECT_AUTO.value)
reveal_type(SomeIntEnum.INCORRECT_AUTO.value)

class SomeStrEnum(StrEnum):
    CORRECT_AUTO = auto()
    INCORRECT_AUTO = auto

reveal_type(SomeStrEnum.CORRECT_AUTO.value)
reveal_type(SomeStrEnum.INCORRECT_AUTO.value)

Running this code will actually crash with a TypeError, but mypy will pass:

Expected Behavior

I expect mypy to error when one forgets to call auto, as:

  1. The code doesn't run
  2. Even if it did run, the enum's value wouldn't be a primitive as intended

Actual Behavior

mypy passes with the below output:

a.py:7:13: note: Revealed type is "builtins.int"
a.py:8:13: note: Revealed type is "def () -> enum.auto"
a.py:14:13: note: Revealed type is "builtins.str"
a.py:15:13: note: Revealed type is "def () -> enum.auto"

Your Environment

jamesbraza commented 1 month ago

The issue may be related to typeshed currently typing auto with Any: https://github.com/python/typeshed/blob/8a7f09e3511f3a1d04281c60167b8dcc3b78938b/stdlib/enum.pyi#L323