python / python/mypy

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

Offen
#18,722 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-enum
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Führe zunächst die bereitgestellte Python-3.12-Reproduktion mit und ohne --strict aus und vergleiche sie mit dem verlinkten Playground. Verfolge, wie mypy mit durch @enum.member dekorierten Membern und Enum-Vollständigkeitsprüfungen umgeht. Als erledigt gilt die Aufgabe, wenn das Beispiel keine Fehler erzeugt, einschließlich beider assert_never-Aufrufe und der Definition des dekorierten Members.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.