In Python ist ein Enum eine Menge eindeutiger Namen, die an eindeutige, konstante Werte gebunden sind.
Enums werden definiert, indem man von einer Enum-Klasse erbt.
Eingebaute Enum-Typen sind im Modul enum verfügbar, und die Klasse Enum kannst du mit from enum import Enum importieren.
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
Beachte, dass die Werte der enum-Member beliebige Datentypen sein können, etwa str, tuple, float usw.
class Color(Enum):
RED = 'red'
GREEN = 'green'
Enums kannst du auch mit der Funktionsaufruf-Syntax erstellen.
from enum import Enum
Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
Animal.ANT.value
#=> 1
Wenn du in einem enum denselben Wert an zwei Member vergibst, wird der zuletzt zugewiesene Member zu einem Alias für den ersten. Es ist nicht erlaubt, denselben Namen für zwei verschiedene Member eines enum zu verwenden.
class Color(Enum):
RED = 1
GREEN = 2
ALIAS_OF_RED = 1
Color.ALIAS_OF_RED
#=> <Color.RED: 1>
Um die Member des Enums zu durchlaufen, kannst du die übliche Syntax for member in verwenden:
for member in Color:
print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)
# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)
Enum-Member kannst du mit is (Identitätsoperator) oder is not vergleichen. Die Operatoren == und != (Gleichheitsoperatoren) funktionieren genauso:
a = Color.RED
a is Color.RED
#=> True
a == Color.RED
#=> True
Für die Zuweisung ganzzahliger Werte beginnt die auto()-Funktion bei 1 und vergibt die folgenden Werte automatisch.
class Shape(Enum):
CIRCLE = auto()
SQUARE = auto()
OVAL = auto()
Um Aliasing zu unterbinden (also doppelte Werte mit verschiedenen Namen zu verhindern), kannst du den Klassendekorator @enum.unique verwenden.
@enum.unique
class Shape(Enum):
CIRCLE = 1
SQUARE = 2
TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE
Um auf einen enum-Member für einen bestimmten Wert zuzugreifen, kannst du diese Notation verwenden: <EnumName>(<value>).
g = Color(2)
g is Color.GREEN
#=> True
g
#=> <Color.GREEN: 2>
Ein eigenes eingeschränktes Enum kannst du schreiben, indem du mit einem beliebigen Mix-in oder Datentyp von der Klasse Enum ableitest.
Zum Beispiel:
class StrEnum(str, Enum):
pass
Eine Unterklasse von Enum ist nur erlaubt, wenn das enum keine Member definiert.
Weitere Details und Erklärungen findest du im enum-How-to und im enum-Cookbook.