PythonのEnumの使い方【Ver3.4 ~】

166, 2021-01-22

目次

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



この記事のアンケートを送信する