Pythonで列挙型(enum)を使う

Python バージョン3.4から列挙型(enum)がサポートされました。

列挙型(enum)の使い方を確認します。

列挙型(Enum)の作成

class文を使った作成方法

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     BLUE = 2
...     GREEN = 3
...
>>> Color.RED
<Color.RED: 1>
>>> Color.RED.value
1

Enumの値の設定方法

enumの値は数値である必要はありません。
文字列を使用するサンプルです。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     GREEN = "緑"
...
>>> Color.RED
<Color.RED: '赤'>
>>> Color.RED.value
'赤'

autoを使って、値を自動的に設定できます。

>>> from enum import Enum, auto
>>> class Color(Enum):
...     RED = auto()
...     BLUE = auto()
...     GREEN = auto()
...
>>> Color.RED
<Color.RED: 1>
>>> Color.RED.value
1
>>> list(Color)
[<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]

ドキュメントによると、「すべての列挙型メンバーの評価は True でなければならない」とのこと。
 None,False,0,”などは値に使えない?

機能APIを使った作成方法

Enum()の第1引数は列挙型の名前、第2引数は空白区切りの列挙型のメンバーの名前です。

>>> from enum import Enum
>>> Color = Enum("Color", "RED BLUE GREEN")
>>> Color.RED
<Color.RED: 1>
>>> Color.RED.value
1

第2引数の区切り文字は空白の他にカンマも使用できます。

>>> Color = Enum("Color", "RED, BLUE, GREEN")
>>> Color.RED
<Color.RED: 1>

第2引数には、イテレータで指定することもできます。

>>> from enum import Enum
>>> Color = Enum("Color", ["RED", "BLUE", "GREEN"])
>>> Color.RED
<Color.RED: 1>

名前と値のペアのイテレータで指定することもできます。

>>> from enum import Enum
>>> Color = Enum("Color", [("RED", 2), ("BLUE", 3), ("GREEN", 4)])
>>> Color.RED
<Color.RED: 2>

イテレータの他に、マッピングでも指定できます。

>>> from enum import Enum
>>> Color = Enum("Color", {"RED": 2, "BLUE": 3, "GREEN": 4})
>>> Color.RED
<Color.RED: 2>

列挙型(Enum)のメンバー

列挙型(Enum)は名前(name)と値(value)を持ちます。

>>> from enum import Enum
>>> Color = Enum("Color", "RED BLUE GREEN")
>>> Color.RED
<Color.RED: 1>
>>> Color.RED.value
1

列挙型(Enum)は同じ名前のメンバーを複数持つことはできません。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     RED = 2
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in Color

同じ値を持つメンバーを複数持つことはできます。
このとき、後に定義された方は先に定義された方の別名になります。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = 1
...     BLUE = 1
...
>>> Color.RED
<Color.RED: 1>
>>> Color.BLUE
<Color.RED: 1>

uniqueデコレーターを使うと、同じ値を持つメンバーが存在するとき、エラーにできます。

>>> from enum import Enum, unique
>>> @unique
... class Color(Enum):
...     RED = 1
...     BLUE = 1
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ValueError: duplicate values found in <enum 'Color'>: BLUE -> RED

比較

列挙型(Enum)は、==、!=、is、is notで同じかどうかを比較できます。

>>> from enum import Enum
>>> Color = Enum("Color", "RED BLUE GREEN")
>>> Color.RED == Color.BLUE
False
>>> Color.RED != Color.BLUE
True
>>> Color.RED is Color.BLUE
False
>>> Color.RED is not Color.BLUE
True

イテレーション

列挙型(enum)はイテレーションをサポートします。
順序は定義順になります。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     GREEN = "緑"
...
>>> print(list(Color))
[<Color.RED: '赤'>, <Color.BLUE: '青'>, <Color.GREEN: '緑'>]
>>> for c in Color:
...     print(c)
...
Color.RED
Color.BLUE
Color.GREEN

列挙型(Enum)の取得

名前から列挙型(Enum)のメンバーを取得する

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     GREEN = "緑"
...
>>> Color["RED"]
<Color.RED: '赤'>
>>> Color["BLUE"]
<Color.BLUE: '青'>

値から列挙型(Enum)のメンバーを取得する

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     GREEN = "緑"
...
>>> Color("赤")
<Color.RED: '赤'>
>>> Color("青")
<Color.BLUE: '青'>
>>> Color("赤")

列挙型(Enum)にメソッドを追加する

列挙型(Enum)はクラスなので、通常のクラスと同じように、メソッドを持たせることができます。

>>> from enum import Enum
>>> class Color(Enum):
...     RED = "赤"
...     BLUE = "青"
...     def to_html(self):
...             if self is self.RED: return "#FF0000"
...             if self is self.BLUE: return "#0000FF"
...
>>> Color.RED.to_html()
'#FF0000'

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください