Edited at

PythonでEnum

Enumは標準モジュールです。

from enum import Enum, unique

@unique
class Game(Enum):
action = "Action"
rpg = "RPG"
simulatoin = "Simulation"
puzzle = "Puzzle"

使えているかチェック

>>> @unique

... class Game(Enum):
... action = "Action"
... rpg = "RPG"
... simulatoin = "Simulation"
... puzzle = "Puzzle"
...
>>> Game.action
<Game.action: 'Action'>
>>> Game.rpg
<Game.rpg: 'RPG'>
>>> Game.rpg.value
'RPG'

以下のような使い方は、そのままでは出来ない。

>>> 'RPG' in Game

False

__members__ を利用すると解決できる。

from enum import Enum, unique

@unique
class Game(Enum):
action = "Action"
rpg = "RPG"
simulatoin = "Simulation"
puzzle = "Puzzle"

@classmethod
def values(self):
return [e.value for e in self.__members__.values()]

>>> Game.values()
# ['Action', 'RPG', 'Simulation', 'Puzzle']
>>> 'RPG' in Game.values()
# True

値がINT型の場合はIntEnumも利用できますが、

以前の互換を維持するためや、Enumが上手くいかないケースでのみ利用を検討するべきと書かれています。

以下は、Color.redはenum型ですが、INT型との比較で同一と判定されている例です。

>>> from enum import IntEnum

>>> class Color(IntEnum):
... red = 0
... yellow = 1
... blue = 2
...
>>> Color.red == 0
True
>>> Color.red.value == 0
True
>>> type(Color.red)
<enum 'Color'>
>>> type(Color.red.value)
<class 'int'>

IntEnumはIntのサブクラスなので、以下のようなことが起こる可能性があります。

よほどのことがない限り、この挙動は意図しないものなはずです。

>>> from enum import IntEnum

>>> class Color(IntEnum):
... red = 0
... yellow = 1
... blue = 2
...
>>> class Season(IntEnum):
... spring = 0
... summer = 1
... autumn = 2
... winter = 3
...
>>> Season.summer == Color.yellow
True

楽しいEnumライフを。