Skip to content

Enum exhaustiveness checks fail with @enum.member-decorated members #18722

Open

Description

@sterliakov

Bug Report

Functions decorated with @enum.member are as rightful enum members as simple non-callable attributes.

Beware of #18721.

To Reproduce

from enum import Enum, member
from typing import assert_never

class E1(Enum):
    C = 1

def check_1(e: E1) -> None:
    match e:
        case E1.C:
            pass
        case other:
            assert_never(other)  # OK

    if e is E1.C:
        pass
    else:
        assert_never(e)  # OK


class E2(Enum):
    @member
    def C() -> None: ...  # E: Method must have at least one argument. Did you forget the "self" argument?  [misc]

def check_2(e: E2) -> None:
    match e:
        case E2.C:
            pass
        case other:
            assert_never(other)  # E: Argument 1 to "assert_never" has incompatible type "E2"; expected "Never"  [arg-type]

    if e is E2.C:
        pass
    else:
        assert_never(e)  # E: Argument 1 to "assert_never" has incompatible type "<subclass of "enum.member[Callable[[], None]]" and "__main__.E2">"; expected "Never"  [arg-type]

playground

Expected Behavior

Green output.

Actual Behavior

main.py:22: error: Method must have at least one argument. Did you forget the "self" argument?  [misc]
main.py:29: error: Argument 1 to "assert_never" has incompatible type "E2"; expected "Never"  [arg-type]
main.py:34: error: Argument 1 to "assert_never" has incompatible type "<subclass of "member" and "E2">"; expected "Never"  [arg-type]
Found 3 errors in 1 file (checked 1 source file)

Your Environment

  • Mypy version used: 1.15.0 and current master
  • Mypy command-line flags: --strict and without
  • Mypy configuration options from mypy.ini (and other config files): N/A
  • Python version used: 3.12
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