Python 3 Enums mit Funktionswerten

8

Ich habe eine Besonderheit im Python 3 Enums ( Link ) bemerkt.
Wenn Sie den Wert einer Enumeration auf eine Funktion setzen, wird verhindert, dass das Attribut als Enum-Objekt umgebrochen wird, wodurch Sie nicht in der Lage sind, die coolen Funktionen wie EnumCls['AttrName'] zum dynamischen Laden des Attributs zu verwenden.

Ist das ein Fehler? Fertig gemacht?
Ich habe eine Weile gesucht, aber keine eingeschränkten Werte gefunden, die Sie in einem Enum verwenden können.

Hier ist ein Beispielcode, der das Problem anzeigt:

%Vor%

Auch das ist meine erste Frage, also lass es mich wissen, wenn ich etwas anders machen sollte! Und danke für die Hilfe!

    
C. Loew 09.08.2015, 17:41
quelle

3 Antworten

7

Die Dokumentation lautet:

  

Die Regeln für das, was erlaubt ist, sind wie folgt: _sunder_ Namen (beginnend und endend mit einem einzelnen Unterstrich) sind reserviert durch enum und können nicht verwendet werden; Alle anderen in einer Enumeration definierten Attribute werden Mitglieder dieser Enumeration, mit Ausnahme von __dunder__ Namen und Deskriptoren (Methoden sind auch Deskriptoren).

Eine "Methode" ist nur eine Funktion, die innerhalb eines Klassenkörpers definiert ist. Es spielt keine Rolle, ob Sie es mit lambda oder def definieren. Ihr Beispiel ist also dasselbe wie:

%Vor%

Mit anderen Worten, Ihre angeblichen Enum-Werte sind tatsächlich Methoden und werden daher nicht Mitglieder der Enum.

    
BrenBarn 09.08.2015, 17:50
quelle
2

Wenn jemand Enum mit Funktionen als Werte verwenden will / kann, ist es möglich, ein aufrufbares Objekt als Proxy zu verwenden, etwa so:

%Vor%

Ein einfacher Test:

%Vor%     
Ceppo93 08.11.2016 12:28
quelle
2

Sie können diese lambdas in Tupel umbrechen und die Methode __call__ überschreiben:

%Vor%

Kann dann verwendet werden:

%Vor%     
K3---rnc 23.11.2016 21:30
quelle

Tags und Links