列挙

列挙型 の Python

1個の演習

列挙型について

Pythonでは、enumとは、一意な名前をそれぞれ一意で定数の値に結び付けた集合です。 Enumsは、Enumクラスを継承することで定義します。 組み込みのenum型はモジュールenumで利用でき、Enumクラスはfrom enum import Enumを使ってインポートできます。

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2

enumのメンバーの値には、strやtuple、floatなど、任意のデータ型を使えることに注意してください。

class Color(Enum):
    RED = 'red'
    GREEN = 'green'

Enumsは、関数呼び出しの構文を使って作成することもできます。

from enum import Enum

Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]

Animal.ANT.value
#=> 1

enum内の2つのメンバーに同じ値を代入すると、あとで代入したメンバーは、先に代入したメンバーのエイリアスになります。1つのenumの異なる2つのメンバーに同じ名前を使うことはできません。

class Color(Enum):
    RED = 1
    GREEN = 2
    ALIAS_OF_RED = 1

Color.ALIAS_OF_RED
#=> <Color.RED: 1>

enumのメンバーを繰り返し処理するには、標準のfor member in構文を使います:

for member in Color:
    print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)

# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
    print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)

Enumのメンバーは、is(同一性演算子)やis notで比較できます。==や!=(等価演算子)も同様に機能します:

a = Color.RED

a is Color.RED
#=> True

a == Color.RED
#=> True

整数値を代入するには、auto()関数を使うと、1から始まって以降の値が自動的に設定されます。

class Shape(Enum):
    CIRCLE = auto()
    SQUARE = auto()
    OVAL = auto()

エイリアスを禁止する(異なる名前で同じ値が重複するのを防ぐ)には、クラスデコレーターの@enum.uniqueデコレーターを使うとよいでしょう。

@enum.unique
class Shape(Enum):
    CIRCLE = 1
    SQUARE = 2
    TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE

ある値に対応するenumメンバーにアクセスするには、<EnumName>(<value>)という記法を使います。

g = Color(2)

g is Color.GREEN
#=> True

g
#=> <Color.GREEN: 2>

任意のミックスインやデータ型を使ってEnumクラスをサブクラス化することで、独自の制限付きEnumを書くことができます。 たとえば、次のとおりです:

class StrEnum(str, Enum):
    pass

Enumのサブクラス化は、enumがメンバーを1つも定義していない場合にのみ許可されます。 詳しい説明は、enumのハウツーとenumのクックブックを参照してください。

GitHubで編集 リンクは新しいウィンドウまたはタブで開きます