Adding members to Python Enums Adding members to Python Enums python python

Adding members to Python Enums


This is a job for the extend_enum function from the aenum library1.


A couple sample Enums:

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

extend_enum in action:

from aenum import extend_enumextend_enum(Color, 'white', 1)print Color, list(Color)print repr(Color.black), Color.black, repr(Color.white), Color.whiteprintextend_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__

Which gives us:

<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 Disclosure: I am the author of the Python stdlib Enum, the enum34 backport, and the Advanced Enumeration (aenum) library.


Enums are immutable, that's rather the point. You can create a new enum that replaces the original instead:

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

but any existing references (say, in other modules) would continue to use the old definition.

names can be:

  • A string containing member names, separated either with spaces or commas. Values are incremented by 1 from start (which can be set as a keyword argument and defaults to 1).
  • An iterable of member names (as in the code above). Values are incremented by 1 from start.
  • An iterable of (member name, value) pairs.
  • A mapping of member name -> value pairs.