Можно ли передать kwargs в настроенное перечисление python

Вы можете настроить перечисление, чтобы члены имели дополнительные атрибуты. Тому можно найти множество примеров. Все они выглядят примерно так:

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 в качестве позиционного аргумента.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы могли бы сделать

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 в качестве позиционного аргумента, чтобы добиться того же, что и при использовании kwargs, но это не отвечает на вопрос. Я хотел бы знать, существует ли синтаксис для использования kwargs.

mahkitah 04.04.2023 14:24

Синтаксис тогда dict(bar = "b", ...), нет отдельного синтаксиса для того, как обычно передаются аргументы ключевого слова.

AKX 04.04.2023 14:25
Ответ принят как подходящий

В настоящее время нет способа передать аргументы ключевого слова перечислению __new__ или __init__, хотя в будущем он может появиться.

Сторонняя библиотека aenum1 разрешает такие аргументы, используя свой собственный auto.


1 Раскрытие информации: я являюсь автором Python stdlib Enum , бэкпорта enum34 и библиотеки Advanced Enumeration (aenum).

Другие вопросы по теме