Enumとは
列挙型(enum)は、一連の名前付き値で構成される、独自のデータ型です。別の言い方をすると、列挙型は関連する定数をグループ化し、あらかじめ定義された値のいずれかを取る新しい型を作成する方法です。
例えば、タスクの異なる状態を追跡する必要があるシステムを開発しているとします。これらの状態は、「未着手」「進行中」「完了」「保留中」などのものが考えられます。ここでは、TaskStatus
という名前の列挙型を作成し、これらの状態を列挙型のメンバーとして持つことができます。これにより、システム内でタスクの状態を整理された、整然とした、エラーに強い方法で扱うことができます。
PythonにおけるEnum
Pythonで列挙型(enum)を使用する方法について説明します。列挙型の定義方法、メンバーへのアクセス方法、列挙型の反復方法について説明します。
Enumモジュール
Pythonには、列挙型を作成するためのenum
モジュールが用意されています。このモジュールは、任意の列挙型を派生させるために使用できる基本クラスEnum
を定義しています。
from enum import Enum
列挙型の定義
Pythonで列挙型を定義するには、Enum
を継承したクラスを作成し、各可能な値に対してクラス属性を追加します。
例えば、曜日のためのDay
という列挙型を定義できます。
from enum import Enum
class Day(Enum):
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
THURSDAY = 4
FRIDAY = 5
SATURDAY = 6
SUNDAY = 7
この例では、Day
が列挙型であり、MONDAY
、TUESDAY
、WEDNESDAY
などがそのメンバーです。各メンバーは名前(例: MONDAY
)と値(例: 1
)を持ちます。
列挙型メンバーへのアクセス
Day
列挙型を定義した後、ドット記法を使用してそのメンバーに直接アクセスできます。
print(Day.MONDAY)
print(Day.TUESDAY)
Day.MONDAY
Day.TUESDAY
また、列挙型のメンバーの値には、.value
プロパティを使用してアクセスすることもできます。
print(Day.MONDAY.value)
これにより、1
という出力が得られます。
列挙型の反復処理
列挙型は反復可能です。for
ループを使用して列挙型を反復処理することができます。
for day in Day:
print(day)
Day.MONDAY
Day.TUESDAY
Day.WEDNESDAY
Day.THURSDAY
Day.FRIDAY
Day.SATURDAY
Day.SUNDAY
列挙型の比較
列挙型のメンバーは、その識別子や値を使用して比較することができます。メンバーの識別子を使用して比較する場合(すなわち、is
を使用する場合)、同じ列挙型の正確に同じメンバーであるかどうかを比較します。値を使用してメンバーを比較する場合(すなわち、==
を使用する場合)、値が同じかどうかを比較します。
以下に例を示します。
print(Day.MONDAY is Day.MONDAY) # True
print(Day.MONDAY is Day.TUESDAY) # False
print(Day.MONDAY == Day.MONDAY) # True
print(Day.MONDAY == Day.TUESDAY) # False
print(Day.MONDAY == 1) # True
列挙型でのエイリアス
Pythonの列挙型では、同じ値を持つ2つのメンバーを持つことができます。この場合、2番目のメンバーは最初のメンバーのエイリアスと見なされます。
以下に例を示します。
from enum import Enum
class Color(Enum):
RED = 1
BLUE = 2
GREEN = 3
YELLOW = 4
ORANGE = 1
この場合、ORANGE
はRED
のエイリアスです。Color.ORANGE
にアクセスしようとすると、Color.RED
が返されます。
print(Color.ORANGE) # Output: Color.RED
列挙型でのAuto()
列挙型のメンバーごとに関連付けられる実際の値に関心がない場合は、auto()
関数を使用して値を自動的に割り当てることができます。
以下に例を示します。
from enum import Enum, auto
class Color(Enum):
RED = auto()
BLUE = auto()
GREEN = auto()
YELLOW = auto()
この場合、PythonはRED
に1
、BLUE
に2
、GREEN
に3
、YELLOW
に4
という値を自動的に割り当てます。
一意な列挙型メンバーの確保
列挙型の全てのメンバーに一意の値を持たせたい場合は、enum
モジュールの@unique
デコレータを使用することができます。もし非一意の値を持つ列挙型にこのデコレータを適用した場合、PythonはValueError
を発生させます。
from enum import Enum, unique
@unique
class Color(Enum):
RED = 1
BLUE = 2
GREEN = 3
YELLOW = 4
ORANGE = 5
この場合、もしすでに使用されている値(例えば、PINK = 1
)を持つ別の色を追加しようとすると、PythonはValueError
を発生させます。