Pythonでは、enumとは、一意な名前をそれぞれ一意で定数の値に結び付けた集合です。
Enumsは、Enumクラスを継承することで定義します。
組み込みのenum型はモジュールenumで利用でき、Enumクラスはfrom enum import Enumを使ってインポートできます。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
enumのメンバーの値には、strやtuple、floatなど、任意のデータ型を使えることに注意してください。
class Color(Enum):
RED = 'red'
GREEN = 'green'
Enumsは、関数呼び出しの構文を使って作成することもできます。
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
enum内の2つのメンバーに同じ値を代入すると、あとで代入したメンバーは、先に代入したメンバーのエイリアスになります。1つのenumの異なる2つのメンバーに同じ名前を使うことはできません。
class Color(Enum):
RED = 1
GREEN = 2
ALIAS_OF_RED = 1
Color.ALIAS_OF_RED
#=> <Color.RED: 1>
enumのメンバーを繰り返し処理するには、標準のfor member in構文を使います:
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のメンバーは、is(同一性演算子)やis notで比較できます。==や!=(等価演算子)も同様に機能します:
a = Color.RED
a is Color.RED
#=> True
a == Color.RED
#=> True
整数値を代入するには、auto()関数を使うと、1から始まって以降の値が自動的に設定されます。
class Shape(Enum):
CIRCLE = auto()
SQUARE = auto()
OVAL = auto()
エイリアスを禁止する(異なる名前で同じ値が重複するのを防ぐ)には、クラスデコレーターの@enum.uniqueデコレーターを使うとよいでしょう。
@enum.unique
class Shape(Enum):
CIRCLE = 1
SQUARE = 2
TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE
ある値に対応するenumメンバーにアクセスするには、<EnumName>(<value>)という記法を使います。
g = Color(2)
g is Color.GREEN
#=> True
g
#=> <Color.GREEN: 2>
任意のミックスインやデータ型を使ってEnumクラスをサブクラス化することで、独自の制限付きEnumを書くことができます。
たとえば、次のとおりです:
class StrEnum(str, Enum):
pass
Enumのサブクラス化は、enumがメンバーを1つも定義していない場合にのみ許可されます。
詳しい説明は、enumのハウツーとenumのクックブックを参照してください。