PythonのEnumの使い方【Ver3.4 ~】
- 作成日: 2021-01-21
- 更新日: 2023-12-24
- カテゴリ: Python
Pythonの列挙型(Enum)
Pythonのバージョン3.4から列挙型という標準ライブラリが追加されました。
列挙型はC/C++などでおなじみの構造ですが、それがPythonでも使えるようになっています。
列挙型を表すクラスはEnumです。
このEnumを継承したクラスを作ることで列挙型を定義できます。
この記事ではPythonの列挙型について具体的に↓を見ていきます。
- 列挙型の使い方
- 定数の型判定
- 自動定数の定義
- 重複した定数の定義
- ユニークな定数の定義
列挙型の使い方
Pythonの列挙型、Enumを使うにはまずenum
モジュールからEnum
クラスをインポートします。
from enum import Enum
こうするとEnum
クラスを使えるようになります。
インポートでエラーが出る場合はPythonのバージョンを確認してください。
それからEnum
クラスを継承したクラスを作り、属性を値で初期化します。
from enum import Enum
class Animal(Enum):
CAT = 1
DOG = 2
BIRD = 3
↑の場合、Animal
という列挙型を作り、その中で、CAT
, DOG
, BIRD
という定数を作っています。
これらの定数は↓のように参照することが可能です。
print(Animal.CAT)
# Animal.CAT
文字列定数の定義
定数の値には文字列を使うことも出来ます。
class Animal(Enum):
CAT = 'cat'
DOG = 'dog'
BIRD = 'bird'
実数、文字列の複合定義
定数の値には実数と文字列を織り交ぜて使うことが出来ます。
class Animal(Enum):
CAT = 'cat'
DOG = 2
BIRD = 3.14
定数の文字列への変換
定数は文字列に変換することが出来ます。
文字列に変換すると↓のようになります。
print(str(Animal.CAT))
# Animal.CAT
定数をrepr()で参照する
定数をrepr()
で参照すると定数の名前と値を表示することが出来ます。
print(repr(Animal.CAT))
# <Animal.CAT: 1>
列挙型をfor文で回す
列挙型はfor
文で回すことが出来ます。
for n in Animal:
print(n)
↑のコードの出力結果は↓のようになります。
Animal.CAT
Animal.DOG
Animal.BIRD
定数によるリストの参照
定数をリストの添え字に使いたい場合は、定数の属性value
を添え字として使います。
from enum import Enum
class Animal(Enum):
CAT = 0
DOG = 1
BIRD = 2
lis = [10, 20, 30]
print(lis[Animal.DOG.value])
# 20
↑のようにvalue
を添え字に使うと、↑の場合DOG
の値1
を参照できます。
定数による辞書、集合の参照
定数はハッシュ化可能なため、辞書や集合のキーとして使うことが出来ます。
from enum import Enum
class Animal(Enum):
CAT = 0
DOG = 1
BIRD = 2
d = {}
d[Animal.CAT] = 'cat'
d[Animal.DOG] = 'dog'
print(d)
# {<Animal.CAT: 0>: 'cat', <Animal.DOG: 1>: 'dog'}
定数の型判定
定数は所属する列挙型クラスを型として持ちます。
from enum import Enum
class Animal(Enum):
CAT = 0
DOG = 1
BIRD = 2
print(type(Animal.CAT))
# <enum 'Animal'>
よってisinstance()
で↓のように型判定することが可能です。
print(isinstance(Animal.CAT, Animal))
# True
自動定数の定義(auto)
定数の値を自動で割り振りたい場合はauto()
を使います。
from enum import Enum, auto
class Animal(Enum):
CAT = auto()
DOG = auto()
BIRD = auto()
for n in Animal:
print(repr(n))
↑のコードの出力結果は↓のようになります。
<Animal.CAT: 1>
<Animal.DOG: 2>
<Animal.BIRD: 3>
重複した定数の定義
列挙型はデフォルトで重複した定数の値を許しています。
ですので↓のように列挙型を作ることも出来ます。
from enum import Enum, auto
class Animal(Enum):
CAT = 1
DOG = 2
BIRD = 1
print(Animal.CAT)
print(Animal.DOG)
print(Animal.BIRD)
↑の場合、定数BIRD
は定数CAT
のエイリアス(別名)になります。
↑のコードの出力結果は↓のようになります。
Animal.CAT
Animal.DOG
Animal.CAT
↑の出力結果を見ると、最後のBIRD
の出力がCAT
になっているのがわかります。
これはBIRD
がCAT
の別名だからです。
ユニークな定数の定義(unique)
列挙型内で重複した定数を許したくない場合は、unique
デコレーターを使います。
↓のように列挙型にunique
デコレーターを使った状態で重複した値を定義すると例外ValueError
が発生します。
from enum import Enum, unique
@unique
class Animal(Enum):
CAT = 1
DOG = 2
BIRD = 1
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Animal'>: BIRD -> CAT
おわりに
今回はPythonの列挙型(Enum)を解説しました。
列挙型は使い慣れると非常に便利な構造と言えます。