PythonのEnumは非常に便利な機能で、一意の値に紐付けられたシンボリックな名前の集合を作成することができます。しかし、デフォルトでは、Enumのメンバーはそれぞれのvalue
をkey
に取得できますが、それ以外の値をkey
にすることはできません。
以下に、通常のEnumの利用方法を示します。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
# 1や2といったvalueをkeyにして各メンバーにアクセスできます
color = Color(1)
print(color) # Color.RED
しかし、例えばColor('red')
やColor('赤')
でもアクセスできたら、Enumの可能性が広がります。そのためには、通常のEnumを拡張する必要があります。
以下に、keyを拡張したEnumの実装を示します。
from enum import Enum
class Color(Enum):
def __new__(cls, value, en, ja):
obj = object.__new__(cls)
obj._value_ = value
cls._value2member_map_.update({en: obj, ja: obj})
return obj
RED = (1, 'red', '赤')
GREEN = (2, 'green', '緑')
BLUE = (3, 'blue', '青')
# 'red'や'赤'でアクセスすると
color = Color('red')
print(color) # Color.RED
red = Color('赤')
print(red) # Color.RED
このように、Enumのkeyを拡張することで、より柔軟なコードを書くことが可能になります。ただし、keyがかぶったりする可能性もありますので、注意が必要です。