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')]
@classmethod
wäre erforderlich, eine Instanz der Color
Klasse zu erstellen . Deshalb staticmethod
scheint hier die richtige Wahl zu sein.
@classmethod
und verwenden return list(map(lambda c: c.value, cls))
.
Basierend auf der Antwort von @Jeff, überarbeitet, um a zu verwenden, classmethod
damit 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 Enum
hat 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 Enum
Mitglieder zu erstellen . ... übrigens, positiv bewertet, weil ich ein neues ( für mich ) Attribut in die Tabelle aufgenommen habe.
Klasse enum.Enum
ist 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)