Добавление членов в Python Enums

Я понимаю, что это НЕ стандартный вариант использования, но мне нужно динамически добавлять элементы в производный класс IntEnum в Python. Обратите внимание, что динамического создания Enum с использованием функционального API недостаточно. Мне нужно добавить элементы в существующее перечисление. Как я могу это сделать?

Предыстория: для тех из вас, кто задается вопросом, почему кто-то хочет это сделать. Я обертываю библиотеку, и значения для перечисления определяются в библиотеке. Я могу запросить имена и значения, используя библиотечный API. Но я не могу сделать это при инициализации, поскольку это зависит от компонентов, которые динамически загружаются библиотекой по запросу пользователя. Я могу загрузить все компоненты при запуске и использовать функциональный API для создания перечисления при импорте, но это требует много времени и имеет побочные эффекты.

Перечисления неизменны , это скорее точка. Вы можете создать новое перечисление, заменяющее оригинал:

 from enum import Enum names = [m.name for m in ExistingEnum] + ['newname1', 'newname2'] ExistingEnum = Enum('ExistingEnum', names) 

но любые существующие ссылки (например, в других модулях) будут продолжать использовать старое определение.

names могут быть:

  • Строка, содержащая имена участников, разделенные пробелами или запятыми. Значения увеличиваются на 1 от start (который может быть установлен как аргумент ключевого слова и по умолчанию равен 1).
  • Итерируемый имена членов (как в приведенном выше коде). Значения увеличиваются на 1 с start .
  • Итерируемые пары (имя члена, значение).
  • Отображение пар имени имени -> пары значений.

Это задание функции extend_enum из библиотеки aenum 1 .


Пример пары Enum s:

 class Color(Enum): black = 0 class ColorHelp(Enum): _init_ = 'value __doc__' black = 0, 'the absence of color' 

extend_enum в действии:

 from aenum import extend_enum extend_enum(Color, 'white', 1) print Color, list(Color) print repr(Color.black), Color.black, repr(Color.white), Color.white print extend_enum(ColorHelp, 'white', 1, 'the presence of every color') print ColorHelp, list(ColorHelp) print repr(ColorHelp.black), ColorHelp.black, ColorHelp.black.__doc__, repr(ColorHelp.white), ColorHelp.white, ColorHelp.white.__doc__ 

Что дает нам:

 <enum 'Color'> [<Color.black: 0>, <Color.white: 1>] <Color.black: 0> Color.black <Color.white: 1> Color.white <enum 'ColorHelp'> [<ColorHelp.black: 0>, <ColorHelp.white: 1>] <ColorHelp.black: 0> ColorHelp.black the absence of color <ColorHelp.white: (1, 'the presence of every color')> ColorHelp.white None 

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