14
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

Organization

Python 3.4.0 の新機能 (2) - enum

昨日のエントリで始めてしまった 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がクラスというのはちょっと意外な気もしたがそれもありかも知れない。たとえば、エラーコードの定義を名前・値ペアでしておいて、必要に応じてそこにメソッド追加していくとか。もう少し実際のコーディングをするとさらに分かってくるのかな。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
14
Help us understand the problem. What are the problem?