Я пытаюсь создать класс Enum динамически, используя тип (имя, основание, dict).

from enum import Enum

class FriendlyEnum(Enum):
    def hello(self):
        print(self.name + ' says hello!')

Нормальный способ работает нормально:

class MyEnum(FriendlyEnum):
    foo = 1
    bar = 2

MyEnum.foo.hello()

# ->
foo says hello!

Но если я попробую динамически:

MyEnum = type('MyEnum',
    (FriendlyEnum,),
    {'foo':1,'bar':2}
)

MyEnum.foo.hello()

# ->
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/enum.py", line 146, in __new__
enum_members = {k: classdict[k] for k in classdict._member_names}
AttributeError: 'dict' object has no attribute '_member_names'

Какие-либо предложения?

Это может быть полезно для тестирования методов родительского класса Enum, динамического создания новых классов Enum с разными атрибутами и одинаковыми унаследованными методами.

2
valcapp 25 Сен 2021 в 20:00

2 ответа

Лучший ответ

Класс Enum можно вызывать для динамического создать новый тип Enum. Это также будет работать для подклассов Enum

MyEnum = FriendlyEnum('MyEnum', {'foo': 1, 'bar': 2})
MyEnum.foo.hello()
2
Iain Shelvington 25 Сен 2021 в 17:14

Объяснение того, почему это не работает: EnumMeta ожидает, что словарь классов (classdict выше) будет экземпляром enum._EnumDict, но то, что вы дали ему, было обычным dict (следовательно, нет _member_names атрибут).

Использование type для непосредственного создания enum не поддерживается - используйте метод , описанный Иэном Шелвингтоном вместо этого.

0
Ethan Furman 25 Сен 2021 в 17:22