PythonのEnumの使い方【Ver3.4 ~】
目次
- Pythonの列挙型(Enum)
- 列挙型の使い方
- 文字列定数の定義
- 実数、文字列の複合定義
- 定数の文字列への変換
- 定数をrepr()で参照する
- 列挙型をfor文で回す
- 定数によるリストの参照
- 定数による辞書、集合の参照
- 定数の型判定
- 自動定数の定義(auto)
- 重複した定数の定義
- ユニークな定数の定義(unique)
- おわりに
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)を解説しました。
列挙型は使い慣れると非常に便利な構造と言えます。