
Pythonでの列挙型(enum)の使い方とは?識別子の集合について紹介!
目次
Pythonでの列挙型(enum)の使い方とは?
今回は、Pythonでの列挙型(enum)の使い方について説明します。
enumとは、識別子の集合です。通常、意味のある集合体として定義します。
ここでは、Enumクラス、IntEnumクラス、Flagクラス、unique、auto関数
について紹介します。
Pythonでのenumの使い方に興味のある方はぜひご覧ください。
Enumクラス
Pythonにおけるenumの基底クラスであるEnumクラスの使い方を紹介します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 |
from enum import Enum class Fruits(Enum): APPLE= 1 BANANA = 2 CHERRY = 3 print(Fruits.APPLE) # Fruits.APPLE print(repr(Fruits.BANANA)) # <Fruits.BANANA: 2> print(type(Fruits.CHERRY)) # <enum 'Fruits'> |
実行結果は以下のようになります。
1 2 3 |
Fruits.APPLE <Fruits.BANANA: 2> <enum 'Fruits'> |
enumの比較は以下のように記述します。
1 2 3 4 |
print(isinstance(Fruits.APPLE, Fruits)) # True print(Fruits.BANANA == Fruits.BANANA) # True print(Fruits.BANANA == Fruits.CHERRY) # False print(Fruits.APPLE == 1) # False |
実行結果は以下のようになります。
1 2 3 4 |
True True False False |
enumの識別子や値を確認するには、以下のように記述します。
1 2 |
print(Fruits.APPLE.name) # APPLE print(Fruits.BANANA.value) # 2 |
実行結果は以下のようになります。
1 2 |
APPLE 2 |
enumはfor文で全要素を処理できます。
1 2 |
for fruits in Fruits: print(fruits, fruits.name, fruits.value) |
実行結果は以下のようになります。
1 2 3 |
Fruits.APPLE APPLE 1 Fruits.BANANA BANANA 2 Fruits.CHERRY CHERRY 3 |
配列のように要素にアクセスすることもできます。
1 2 3 4 |
print(Fruits(1)) # Fruits.APPLE print(Fruits['BANANA']) # Fruits.BANANA print(Fruits(2).value) # 2 print(Fruits['CHERRY'].name) # CHERRY |
実行結果は以下のようになります。
1 2 3 4 |
Fruits.APPLE Fruits.BANANA 2 CHERRY |
要素が重複すると、コンパイルエラーになります。
1 2 3 4 5 |
from enum import Enum class Fruits(Enum): APPLE= 1 BANANA = 2 BANANA = 3 |
コンパイル結果は以下のようになります。
1 |
TypeError: Attempted to reuse key: 'BANANA' |
Pythonでは、このようにenumを使用します。
IntEnumクラス
EnumクラスおよびintのサブクラスでもあるIntEnumクラスを紹介します。PythonのIntEnumクラスはint型と比較できます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from enum import Enum, IntEnum class Fruits(Enum): APPLE = 1 BANANA = 2 CHERRY = 3 class Color(IntEnum): RED = 1 GREEN = 2 BLUE = 3 class OS(IntEnum): WINDOWS = 1 LINUX = 2 MAC = 3 # Enumはintと比較できない print(Fruits.APPLE == 1) # False # IntEnumはintと比較できる print(Color.RED == 1) # True print(Color.RED == OS.WINDOWS) # True print(int(Color.GREEN)) # 2 |
実行結果は以下のようになります。
1 2 3 4 |
False True True 2 |
このように、PythonのIntEnumクラスはint型と比較できます。
Flagクラス
ビット演算子 (&, |, ^, ~) が使用可能なenumである、Flagクラスを紹介します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from enum import Flag, auto class Fruits(Flag): APPLE = auto() BANANA = auto() CHERRY = auto() MIX1 = APPLE | BANANA MIX2 = APPLE | BANANA | CHERRY for fruits in Fruits: print(fruits, fruits.name, fruits.value) print(Fruits.MIX1 == (Fruits.APPLE | Fruits.BANANA)) # True print(Fruits.APPLE in Fruits.MIX1) # True print(Fruits.BANANA in Fruits.MIX1) # True print(Fruits.CHERRY in Fruits.MIX1) # False |
実行結果は以下のようになります。
1 2 3 4 5 6 7 8 9 |
Fruits.APPLE APPLE 1 Fruits.BANANA BANANA 2 Fruits.CHERRY CHERRY 4 Fruits.MIX1 MIX1 3 Fruits.MIX2 MIX2 7 True True True False |
このように、PythonのFlagクラスはビット演算子が使用できます。
unique
識別子が重複しないことを保証するデコレーターである、uniqueを紹介します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 |
from enum import Enum, unique @unique class Fruits(Enum): APPLE= 1 BANANA = 2 CHERRY = 2 |
以下のようなコンパイルエラーが発生します。
1 |
ValueError: duplicate values found in <enum 'Fruits'>: CHERRY -> BANANA |
@uniqueをコメントアウトするとコンパイルエラーにはなりません。
1 2 3 4 5 6 7 8 9 |
from enum import Enum, unique #@unique class Fruits(Enum): APPLE= 1 BANANA = 2 CHERRY = 2 for fruits in Fruits: print(fruits, fruits.name, fruits.value) |
実行結果は以下のようになります。
1 2 |
Fruits.APPLE APPLE 1 Fruits.BANANA BANANA 2 |
このようにPythonでは、識別子を重複させたくない場合はuniqueを使用します。
auto関数
値をプログラマが指定する必要がない場合、auto関数が使用できます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 |
from enum import Enum, auto class Fruits(Enum): APPLE = auto() BANANA = auto() CHERRY = auto() for fruits in Fruits: print(fruits, fruits.name, fruits.value) |
実行結果は以下のようになります。
1 2 3 |
Fruits.APPLE APPLE 1 Fruits.BANANA BANANA 2 Fruits.CHERRY CHERRY 3 |
このようにPythonでは、値をプログラマが指定する必要がない場合、auto関数が使用できます。
まとめ
いかがでしたでしょうか。Pythonでの列挙型(enum)の使い方について説明しました。
enumとは、識別子の集合です。通常、意味のある集合体として定義します。
ここでは、Enumクラス、IntEnumクラス、Flagクラス、unique、auto関数
について紹介しました。
ぜひご自身でソースコードを書いて、理解を深めてください。