Ich verwende die Enum4-Bibliothek, um eine Enum-Klasse wie folgt zu erstellen:
class Color(Enum):
RED = 1
BLUE = 2
Ich möchte [1, 2]irgendwo als Liste drucken . Wie kann ich das erreichen?
Ich verwende die Enum4-Bibliothek, um eine Enum-Klasse wie folgt zu erstellen:
class Color(Enum):
RED = 1
BLUE = 2
Ich möchte [1, 2]irgendwo als Liste drucken . Wie kann ich das erreichen?
Antworten:
Sie können IntEnum verwenden :
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
print(int(Color.RED)) # prints 1
So erhalten Sie eine Liste der Ints:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
a = [(int(v), str(v)) for v in Color]und dann print(a).
[(color.value, color.name) for color in Color]
Um Enum mit einem beliebigen Wert zu verwenden, versuchen Sie
Folgendes : Mit einigen Verbesserungen aktualisiert ... Vielen Dank an @Jeff, durch Ihren Tipp!
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 'GREEN'
BLUE = ('blue', '#0000ff')
@staticmethod
def list():
return list(map(lambda c: c.value, Color))
print(Color.list())
Als Ergebnis:
[1, 'GREEN', ('blue', '#0000ff')]
@classmethodwäre erforderlich, eine Instanz der ColorKlasse zu erstellen . Deshalb staticmethodscheint hier die richtige Wahl zu sein.
@classmethodund verwenden return list(map(lambda c: c.value, cls)).
Basierend auf der Antwort von @Jeff, überarbeitet, um a zu verwenden, classmethoddamit Sie denselben Code für jede Ihrer Aufzählungen wiederverwenden können:
from enum import Enum
class ExtendedEnum(Enum):
@classmethod
def list(cls):
return list(map(lambda c: c.value, cls))
class OperationType(ExtendedEnum):
CREATE = 'CREATE'
STATUS = 'STATUS'
EXPAND = 'EXPAND'
DELETE = 'DELETE'
print(OperationType.list())
Produziert:
['CREATE', 'STATUS', 'EXPAND', 'DELETE']
Das Enumhat also ein __members__Diktat. Die von @ozgur vorgeschlagene Lösung ist wirklich die beste, aber Sie können dies, was dasselbe tut, mit mehr Arbeit tun
[color.value for color_name, color in Color.__members__.items()]
Das __members__Wörterbuch könnte nützlich sein, wenn Sie Dinge dynamisch einfügen möchten ... in einer verrückten Situation.
[EDIT]
Anscheinend __members__handelt es sich nicht um ein Wörterbuch, sondern um einen Map-Proxy. Das heißt, Sie können nicht einfach Elemente hinzufügen.
Sie können jedoch seltsame Dinge wie tun MyEnum.__dict__['_member_map_']['new_key'] = 'new_value', und dann können Sie den neuen Schlüssel verwenden wie MyEnum.new_key... aber dies ist nur ein Implementierungsdetail und sollte nicht damit gespielt werden. Schwarze Magie wird mit enormen Wartungskosten bezahlt.
__members__? Es wäre eine interessante Möglichkeit, Erweiterungen zuzulassen und dadurch neue EnumMitglieder zu erstellen . ... übrigens, positiv bewertet, weil ich ein neues ( für mich ) Attribut in die Tabelle aufgenommen habe.
Klasse enum.Enumist eine Klasse, die alle Ihre Aufzählungsanforderungen löst. Sie müssen also nur davon erben und Ihre eigenen Felder hinzufügen. Von da an müssen Sie nur noch die Attribute aufrufen: name& value:
from enum import Enum
class Letter(Enum):
A = 1
B = 2
C = 3
print({i.name: i.value for i in Letter})
# prints {'A': 1, 'B': 2, 'C': 3}
Verwenden Sie _member_names_für ein schnelles einfaches Ergebnis, wenn es nur die Namen sind, dh
Color._member_names_
Außerdem haben Sie _member_map_ein geordnetes Wörterbuch der Elemente. Diese Funktion gibt a zurück collections.OrderedDict, also haben Sie Color._member_names_.items()und Color._member_names_.values()zum Spielen. Z.B
return list(map(lambda x: x.value, Color._member_map_.values()))
gibt alle gültigen Werte von Color zurück
Sie können die iter () -Funktion verwenden:
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
l=[]
for i in iter(Color):
l.append(i.value)
print(l)