Вы можете настроить перечисление, чтобы члены имели дополнительные атрибуты. Тому можно найти множество примеров. Все они выглядят примерно так:
class EnumWithAttrs(Enum):
def __new__(cls, *args, **kwargs):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
return obj
def __init__(self, a, b):
self.a = a
self.b = b
GREEN = 'a', 'b'
BLUE = 'c', 'd'
этот пример взят из https://stackoverflow.com/a/19300424/6439229
Большинство примеров, которые я нашел, показывают, что __new__ принимает kwargs, но действительно ли синтаксически возможно передать kwargs __new__?
Это дает SyntaxErrors:
class EnumWithAttrs(Enum):
GREEN = 'a', foo='b'
BLUE = 'c', **{'bar': 'd'}
Как и этот функциональный синтаксис:
Color = EnumWithAttrs('Color', [('GREEN', 'a', foo='b'), ('BLUE', 'c', **{'bar': 'd'})])
Люди помещают **kwargs в определение функции __new__ просто по привычке, или действительно есть способ их использовать?
Обновлено: Я не ищу обходной путь для использования kwargs, например, передачу dict в качестве позиционного аргумента.






Вы могли бы сделать
from enum import Enum
class EnumWithAttrs(Enum):
def __new__(cls, *args, **kwargs):
value = len(cls.__members__) + 1
obj = object.__new__(cls)
obj._value_ = value
return obj
def __init__(self, a, attrs):
self.a = a
self.attrs = attrs or {}
class AttributeyColor(EnumWithAttrs):
GREEN = 'a', {'bar': 'b'}
BLUE = 'c', {'glar': 'blarb'}
print(AttributeyColor.GREEN.attrs)
но мне это кажется издевательством над Enums...
Синтаксис тогда dict(bar = "b", ...), нет отдельного синтаксиса для того, как обычно передаются аргументы ключевого слова.
В настоящее время нет способа передать аргументы ключевого слова перечислению __new__ или __init__, хотя в будущем он может появиться.
Сторонняя библиотека aenum1 разрешает такие аргументы, используя свой собственный auto.
1 Раскрытие информации: я являюсь автором Python stdlib Enum , бэкпорта enum34 и библиотеки Advanced Enumeration (aenum).
Конечно, вы можете передать dict в качестве позиционного аргумента, чтобы добиться того же, что и при использовании kwargs, но это не отвечает на вопрос. Я хотел бы знать, существует ли синтаксис для использования kwargs.