昨日のエントリで始めてしまった Python3.4の新規機能紹介。今日はEnum。
これは昔から欲しいなと思っていた機能なので地味に嬉しい。Pythonの場合はEnumは型ではなくクラスになっていて、名前・値のペアを継承したクラスのクラス変数として定義するイメージ。
例として列挙型(Wikipedia)でも取り上げられているCardsuitを使おう。まずは定義から。
from enum import Enum
class Cardsuit(Enum):
CLUBS = 1
DIAMONDS = 2
HEARTS = 3
SPADES = 4
そして使うときには、値を引数にインスタンス化するか、名前をキーにクラス属性を取り出すかする。
# 以下は全て同じ値が代入される
card0 = Cardsuit(2)
card1 = Cardsuit['DIAMONDS']
card2 = Cardsuit.DIAMONDS
# 普通にプリントすると最後の形式で出力される
print(card0, card1, card2) # -> Cardsuit.DIAMONDS Cardsuit.DIAMONDS Cardsuit.DIAMONDS
# 名前と値はそれぞれ別々に取り出せる
print(card0.name, card0.value) # -> DIAMONDS 2
なお、PythonのEnumは
- 別の値を同じ名前に割り当てる ... NG
- 同じ値を別の名前に割り当てる ... OK
となっているが、Enum.uniqueを使うと二つ目もNGにできる
from enum import Enum
# これはOK
class Cardsuit(Enum):
CLUBS = 1
DIAMONDS = 2
HEARTS = 3
SPADES = 4
ALT_SPADES = 4
# これはNG
@unique
class Cardsuit(Enum):
CLUBS = 1
DIAMONDS = 2
HEARTS = 3
SPADES = 4
ALT_SPADES = 4
Enumがクラスというのはちょっと意外な気もしたがそれもありかも知れない。たとえば、エラーコードの定義を名前・値ペアでしておいて、必要に応じてそこにメソッド追加していくとか。もう少し実際のコーディングをするとさらに分かってくるのかな。