ユーニックス総合研究所

  • home
  • archives
  • python-enum

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になっているのがわかります。
これはBIRDCATの別名だからです。

ユニークな定数の定義(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)を解説しました。
列挙型は使い慣れると非常に便利な構造と言えます。