実行時に設定ファイルからいくつかのタイプを生成したいと思います。簡単にするために、データがすでにpython辞書としてロードされていると仮定しましょう:
color_values = dict(RED = 1, YELLOW = 2, GREEN = 3)
これをタイプに変換するにはどうすればよいですか( enum
を使用)
class Color(enum.Enum):
RED = 1
YELLOW = 2
GREEN = 3
以下は機能しません
def make_enum(name, values):
return type(name, (enum.Enum,), values)
>>> Color = make_enum('Color', color_values)
AttributeError: 'dict' object has no attribute '_member_names'
Color = Enum('Color', color_values)
Tada! そのためのAPIが提供されています。また、名前と値のペアの反復可能、名前のみの反復可能(この場合、値は1から自動入力されます)、または空白またはコンマで区切られた名前の文字列(これも自動入力値)。
これがうまくいくように見える1つの超ハッキーなアプローチです:
def make_enum(name, values):
_k = _v = None
class TheEnum(enum.Enum):
nonlocal _k, _v
for _k, _v in values.items():
locals()[_k] = _v
TheEnum.__name__ = name
return TheEnum
キーnonlocal
とEnum
が重複していることについてk
が不平を言うのを防ぐには、そこでv
を使用する必要があります。