Adding members to Python Enums
Enums are immutable, that's rather the point. You can create a new enum that replaces the original instead:
from enum import Enum
names = [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.
This is a job for the extend_enum
function from the aenum library1.
A couple sample Enum
s:
from aenum import Enum
class Color(Enum):
black = 0
class ColorHelp(Enum):
_init_ = 'value __doc__'
black = 0, 'the absence of color'
extend_enum
in action:
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__
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.