web-dev-qa-db-ja.com

値のディクショナリからenum.Enumを作成するにはどうすればよいですか?

実行時に設定ファイルからいくつかのタイプを生成したいと思います。簡単にするために、データがすでに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'
8
Eric
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

キーnonlocalEnumが重複していることについてkが不平を言うのを防ぐには、そこでvを使用する必要があります。

0
Eric