enum
— Support for enumerations¶
Added in version 3.4.
Source code:Lib/enum.py
Important
This page contains the API reference information. For tutorialinformation and discussion of more advanced topics, see
An enumeration:
is a set of symbolic names (members) bound to unique values
can be iterated over to return its canonical (i.e. non-alias) members indefinition order
usescall syntax to return members by value
usesindex syntax to return members by name
Enumerations are created either by usingclass
syntax, or byusing function-call syntax:
>>>fromenumimportEnum>>># class syntax>>>classColor(Enum):...RED=1...GREEN=2...BLUE=3>>># functional syntax>>>Color=Enum('Color',[('RED',1),('GREEN',2),('BLUE',3)])
Even though we can useclass
syntax to create Enums, Enumsare not normal Python classes. SeeHow are Enums different? for more details.
Note
Nomenclature
The class
Color
is anenumeration (orenum)The attributes
Color.RED
,Color.GREEN
, etc., areenumeration members (ormembers) and are functionally constants.The enum members havenames andvalues (the name of
Color.RED
isRED
, the value ofColor.BLUE
is3
, etc.)
Module Contents¶
The
type
for Enum and its subclasses.Base class for creating enumerated constants.
Base class for creating enumerated constants that can be combined usingthe bitwise operations without losing their
Flag
membership.An enumeration with the values
CONTINUOUS
,NAMED_FLAGS
, andUNIQUE
, for use withverify()
to ensure various constraintsare met by a given enumeration.An enumeration with the values
STRICT
,CONFORM
,EJECT
, andKEEP
which allows for more fine-grained control over how invalid valuesare dealt with in an enumeration.Instances are replaced with an appropriate value for Enum members.
StrEnum
defaults to the lower-cased version of the member name,while other Enums default to 1 and increase from there.Allows
Enum
members to have attributes without conflicting withmember names. Thevalue
andname
attributes are implemented thisway.Enum class decorator that ensures only one name is bound to any one value.
Enum class decorator that checks user-selectable constraints on anenumeration.
Make
obj
a member. Can be used as a decorator.Do not make
obj
a member. Can be used as a decorator.Return a list of all power-of-two integers contained in a flag.
Added in version 3.6:Flag
,IntFlag
,auto
Added in version 3.11:StrEnum
,EnumCheck
,ReprEnum
,FlagBoundary
,property
,member
,nonmember
,global_enum
,show_flag_values
Added in version 3.13:EnumDict
Data Types¶
- classenum.EnumType¶
EnumType is themetaclass forenum enumerations. It is possibleto subclassEnumType – seeSubclassing EnumTypefor details.
EnumType
is responsible for setting the correct__repr__()
,__str__()
,__format__()
, and__reduce__()
methods on thefinalenum, as well as creating the enum members, properly handlingduplicates, providing iteration over the enum class, etc.- __call__(cls,value,names=None,*,module=None,qualname=None,type=None,start=1,boundary=None)¶
This method is called in two different ways:
to look up an existing member:
- cls:
The enum class being called.
- value:
The value to lookup.
to use the
cls
enum to create a new enum (only if the existing enumdoes not have any members):- cls:
The enum class being called.
- value:
The name of the new Enum to create.
- names:
The names/values of the members for the new Enum.
- module:
The name of the module the new Enum is created in.
- qualname:
The actual location in the module where this Enum can be found.
- type:
A mix-in type for the new Enum.
- start:
The first integer value for the Enum (used by
auto
).- boundary:
How to handle out-of-range values from bit operations (
Flag
only).
- __contains__(cls,member)¶
Returns
True
if member belongs to thecls
:>>>some_var=Color.RED>>>some_varinColorTrue>>>Color.RED.valueinColorTrue
Changed in version 3.12:Before Python 3.12, a
TypeError
is raised if anon-Enum-member is used in a containment check.- __dir__(cls)¶
Returns
['__class__','__doc__','__members__','__module__']
and thenames of the members incls:>>>dir(Color)['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__']
- __getitem__(cls,name)¶
Returns the Enum member incls matchingname, or raises a
KeyError
:>>>Color['BLUE']<Color.BLUE: 3>
- __iter__(cls)¶
Returns each member incls in definition order:
>>>list(Color)[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
- __len__(cls)¶
Returns the number of member incls:
>>>len(Color)3
- __members__¶
Returns a mapping of every enum name to its member, including aliases
- __reversed__(cls)¶
Returns each member incls in reverse definition order:
>>>list(reversed(Color))[<Color.BLUE: 3>, <Color.GREEN: 2>, <Color.RED: 1>]
- _add_alias_()¶
Adds a new name as an alias to an existing member. Raises a
NameError
if the name is already assigned to a different member.
- _add_value_alias_()¶
Adds a new value as an alias to an existing member. Raises a
ValueError
if the value is already linked with a different member.
Added in version 3.11:Before 3.11
EnumType
was calledEnumMeta
, which is still available as an alias.
- classenum.Enum¶
Enum is the base class for allenum enumerations.
- name¶
The name used to define the
Enum
member:>>>Color.BLUE.name'BLUE'
- value¶
The value given to the
Enum
member:>>>Color.RED.value1
Value of the member, can be set in
__new__()
.Note
Enum member values
Member values can be anything:
int
,str
, etc. Ifthe exact value is unimportant you may useauto
instances and anappropriate value will be chosen for you. Seeauto
for thedetails.While mutable/unhashable values, such as
dict
,list
ora mutabledataclass
, can be used, they will have aquadratic performance impact during creation relative to thetotal number of mutable/unhashable values in the enum.
- _name_¶
Name of the member.
- _order_¶
No longer used, kept for backward compatibility.(class attribute, removed during class creation).
- _ignore_¶
_ignore_
is only used during creation and is removed from theenumeration once creation is complete._ignore_
is a list of names that will not become members, and whosenames will also be removed from the completed enumeration. SeeTimePeriod for an example.
- __dir__(self)¶
Returns
['__class__','__doc__','__module__','name','value']
andany public methods defined onself.__class__:>>>fromdatetimeimportdate>>>classWeekday(Enum):...MONDAY=1...TUESDAY=2...WEDNESDAY=3...THURSDAY=4...FRIDAY=5...SATURDAY=6...SUNDAY=7...@classmethod...deftoday(cls):...print('today is%s'%cls(date.today().isoweekday()).name)...>>>dir(Weekday.SATURDAY)['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'today', 'value']
- _generate_next_value_(name,start,count,last_values)¶
- name:
The name of the member being defined (e.g. ‘RED’).
- start:
The start value for the Enum; the default is 1.
- count:
The number of members currently defined, not including this one.
- last_values:
A list of the previous values.
Astaticmethod that is used to determine the next value returned by
auto
:>>>fromenumimportauto>>>classPowersOfThree(Enum):...@staticmethod...def_generate_next_value_(name,start,count,last_values):...return3**(count+1)...FIRST=auto()...SECOND=auto()...>>>PowersOfThree.SECOND.value9
- __init__(self,*args,**kwds)¶
By default, does nothing. If multiple values are given in the memberassignment, those values become separate arguments to
__init__
; e.g.>>>fromenumimportEnum>>>classWeekday(Enum):...MONDAY=1,'Mon'
Weekday.__init__()
would be called asWeekday.__init__(self,1,'Mon')
- __init_subclass__(cls,**kwds)¶
Aclassmethod that is used to further configure subsequent subclasses.By default, does nothing.
- _missing_(cls,value)¶
Aclassmethod for looking up values not found incls. By default itdoes nothing, but can be overridden to implement custom search behavior:
>>>fromenumimportStrEnum>>>classBuild(StrEnum):...DEBUG=auto()...OPTIMIZED=auto()...@classmethod...def_missing_(cls,value):...value=value.lower()...formemberincls:...ifmember.value==value:...returnmember...returnNone...>>>Build.DEBUG.value'debug'>>>Build('deBUG')<Build.DEBUG: 'debug'>
- __new__(cls,*args,**kwds)¶
By default, doesn’t exist. If specified, either in the enum classdefinition or in a mixin class (such as
int
), all values givenin the member assignment will be passed; e.g.>>>fromenumimportEnum>>>classMyIntEnum(int,Enum):...TWENTYSIX='1a',16
results in the call
int('1a',16)
and a value of26
for the member.Note
When writing a custom
__new__
, do not usesuper().__new__
–call the appropriate__new__
instead.
- __repr__(self)¶
Returns the string used forrepr() calls. By default, returns theEnum name, member name, and value, but can be overridden:
>>>classOtherStyle(Enum):...ALTERNATE=auto()...OTHER=auto()...SOMETHING_ELSE=auto()...def__repr__(self):...cls_name=self.__class__.__name__...returnf'{cls_name}.{self.name}'...>>>OtherStyle.ALTERNATE,str(OtherStyle.ALTERNATE),f"{OtherStyle.ALTERNATE}"(OtherStyle.ALTERNATE, 'OtherStyle.ALTERNATE', 'OtherStyle.ALTERNATE')
- __str__(self)¶
Returns the string used forstr() calls. By default, returns theEnum name and member name, but can be overridden:
>>>classOtherStyle(Enum):...ALTERNATE=auto()...OTHER=auto()...SOMETHING_ELSE=auto()...def__str__(self):...returnf'{self.name}'...>>>OtherStyle.ALTERNATE,str(OtherStyle.ALTERNATE),f"{OtherStyle.ALTERNATE}"(<OtherStyle.ALTERNATE: 1>, 'ALTERNATE', 'ALTERNATE')
- __format__(self)¶
Returns the string used forformat() andf-string calls. By default,returns
__str__()
return value, but can be overridden:>>>classOtherStyle(Enum):...ALTERNATE=auto()...OTHER=auto()...SOMETHING_ELSE=auto()...def__format__(self,spec):...returnf'{self.name}'...>>>OtherStyle.ALTERNATE,str(OtherStyle.ALTERNATE),f"{OtherStyle.ALTERNATE}"(<OtherStyle.ALTERNATE: 1>, 'OtherStyle.ALTERNATE', 'ALTERNATE')
Changed in version 3.12:AddedDataclass support
- classenum.IntEnum¶
IntEnum is the same as
Enum
, but its members are also integers and can beused anywhere that an integer can be used. If any integer operation is performedwith anIntEnum member, the resulting value loses its enumeration status.>>>fromenumimportIntEnum>>>classNumber(IntEnum):...ONE=1...TWO=2...THREE=3...>>>Number.THREE<Number.THREE: 3>>>>Number.ONE+Number.TWO3>>>Number.THREE+58>>>Number.THREE==3True
Changed in version 3.11:
__str__()
is nowint.__str__()
tobetter support thereplacement of existing constants use-case.__format__()
was alreadyint.__format__()
for that same reason.
- classenum.StrEnum¶
StrEnum
is the same asEnum
, but its members are also strings and can be usedin most of the same places that a string can be used. The result of any stringoperation performed on or with aStrEnum member is not part of the enumeration.Note
There are places in the stdlib that check for an exact
str
instead of astr
subclass (i.e.type(unknown)==str
instead ofisinstance(unknown,str)
), and in those locations youwill need to usestr(StrEnum.member)
.Note
__str__()
isstr.__str__()
to better support thereplacement of existing constants use-case.__format__()
is likewisestr.__format__()
for that same reason.Added in version 3.11.
- classenum.Flag¶
Flag
is the same asEnum
, but its members support the bitwiseoperators&
(AND),|
(OR),^
(XOR), and~
(INVERT);the results of those operations are (aliases of) members of the enumeration.- __contains__(self,value)¶
ReturnsTrue if value is in self:
>>>fromenumimportFlag,auto>>>classColor(Flag):...RED=auto()...GREEN=auto()...BLUE=auto()...>>>purple=Color.RED|Color.BLUE>>>white=Color.RED|Color.GREEN|Color.BLUE>>>Color.GREENinpurpleFalse>>>Color.GREENinwhiteTrue>>>purpleinwhiteTrue>>>whiteinpurpleFalse
- __iter__(self):
Returns all contained non-alias members:
>>>list(Color.RED)[<Color.RED: 1>]>>>list(purple)[<Color.RED: 1>, <Color.BLUE: 4>]
Added in version 3.11.
- __len__(self):
Returns number of members in flag:
>>>len(Color.GREEN)1>>>len(white)3
Added in version 3.11.
- __bool__(self):
ReturnsTrue if any members in flag,False otherwise:
>>>bool(Color.GREEN)True>>>bool(white)True>>>black=Color(0)>>>bool(black)False
- __or__(self,other)¶
Returns current flag binary or’ed with other:
>>>Color.RED|Color.GREEN<Color.RED|GREEN: 3>
- __and__(self,other)¶
Returns current flag binary and’ed with other:
>>>purple&white<Color.RED|BLUE: 5>>>>purple&Color.GREEN<Color: 0>
- __xor__(self,other)¶
Returns current flag binary xor’ed with other:
>>>purple^white<Color.GREEN: 2>>>>purple^Color.GREEN<Color.RED|GREEN|BLUE: 7>
- __invert__(self):
Returns all the flags intype(self) that are not inself:
>>>~white<Color: 0>>>>~purple<Color.GREEN: 2>>>>~Color.RED<Color.GREEN|BLUE: 6>
- _numeric_repr_()¶
Function used to format any remaining unnamed numeric values. Default isthe value’s repr; common choices are
hex()
andoct()
.
Changed in version 3.11:Therepr() of zero-valued flags has changed. Itis now::
>>>Color(0)<Color: 0>
- classenum.IntFlag¶
IntFlag
is the same asFlag
, but its members are also integers and can beused anywhere that an integer can be used.>>>fromenumimportIntFlag,auto>>>classColor(IntFlag):...RED=auto()...GREEN=auto()...BLUE=auto()...>>>Color.RED&2<Color: 0>>>>Color.RED|2<Color.RED|GREEN: 3>
If any integer operation is performed with anIntFlag member, the result isnot anIntFlag:
>>>Color.RED+23
If a
Flag
operation is performed with anIntFlag member and:the result is a validIntFlag: anIntFlag is returned
the result is not a validIntFlag: the result depends on the
FlagBoundary
setting
The
repr()
of unnamed zero-valued flags has changed. It is now:>>>Color(0)<Color: 0>
Changed in version 3.11:
__str__()
is nowint.__str__()
to better support thereplacement of existing constants use-case.__format__()
wasalreadyint.__format__()
for that same reason.Inversion of an
IntFlag
now returns a positive value that is theunion of all flags not in the given flag, rather than a negative value.This matches the existingFlag
behavior.
- classenum.ReprEnum¶
ReprEnum
uses therepr()
ofEnum
,but thestr()
of the mixed-in data type:Inherit from
ReprEnum
to keep thestr()
/format()
of the mixed-in data type instead of using theEnum
-defaultstr()
.Added in version 3.11.
- classenum.EnumCheck¶
EnumCheck contains the options used by the
verify()
decorator to ensurevarious constraints; failed constraints result in aValueError
.- UNIQUE¶
Ensure that each value has only one name:
>>>fromenumimportEnum,verify,UNIQUE>>>@verify(UNIQUE)...classColor(Enum):...RED=1...GREEN=2...BLUE=3...CRIMSON=1Traceback (most recent call last):...ValueError:aliases found in <enum 'Color'>: CRIMSON -> RED
- CONTINUOUS¶
Ensure that there are no missing values between the lowest-valued memberand the highest-valued member:
>>>fromenumimportEnum,verify,CONTINUOUS>>>@verify(CONTINUOUS)...classColor(Enum):...RED=1...GREEN=2...BLUE=5Traceback (most recent call last):...ValueError:invalid enum 'Color': missing values 3, 4
- NAMED_FLAGS¶
Ensure that any flag groups/masks contain only named flags – useful whenvalues are specified instead of being generated by
auto()
:>>>fromenumimportFlag,verify,NAMED_FLAGS>>>@verify(NAMED_FLAGS)...classColor(Flag):...RED=1...GREEN=2...BLUE=4...WHITE=15...NEON=31Traceback (most recent call last):...ValueError:invalid Flag 'Color': aliases WHITE and NEON are missing combined values of 0x18 [use enum.show_flag_values(value) for details]
Note
CONTINUOUS and NAMED_FLAGS are designed to work with integer-valued members.
Added in version 3.11.
- classenum.FlagBoundary¶
FlagBoundary
controls how out-of-range values are handled inFlag
and itssubclasses.- STRICT¶
Out-of-range values cause a
ValueError
to be raised. This is thedefault forFlag
:>>>fromenumimportFlag,STRICT,auto>>>classStrictFlag(Flag,boundary=STRICT):...RED=auto()...GREEN=auto()...BLUE=auto()...>>>StrictFlag(2**2+2**4)Traceback (most recent call last):...ValueError:<flag 'StrictFlag'> invalid value 20 given 0b0 10100 allowed 0b0 00111
- CONFORM¶
Out-of-range values have invalid values removed, leaving a valid
Flag
value:>>>fromenumimportFlag,CONFORM,auto>>>classConformFlag(Flag,boundary=CONFORM):...RED=auto()...GREEN=auto()...BLUE=auto()...>>>ConformFlag(2**2+2**4)<ConformFlag.BLUE: 4>
- EJECT¶
Out-of-range values lose their
Flag
membership and revert toint
.>>>fromenumimportFlag,EJECT,auto>>>classEjectFlag(Flag,boundary=EJECT):...RED=auto()...GREEN=auto()...BLUE=auto()...>>>EjectFlag(2**2+2**4)20
- KEEP¶
Out-of-range values are kept, and the
Flag
membership is kept.This is the default forIntFlag
:>>>fromenumimportFlag,KEEP,auto>>>classKeepFlag(Flag,boundary=KEEP):...RED=auto()...GREEN=auto()...BLUE=auto()...>>>KeepFlag(2**2+2**4)<KeepFlag.BLUE|16: 20>
Added in version 3.11.
- classenum.EnumDict¶
EnumDict is a subclass of
dict
that is used as the namespacefor defining enum classes (seePreparing the class namespace).It is exposed to allow subclasses ofEnumType
with advancedbehavior like having multiple values per member.It should be called with the name of the enum class being created, otherwiseprivate names and internal classes will not be handled correctly.Note that only the
MutableMapping
interface(__setitem__()
andupdate()
) is overridden.It may be possible to bypass the checks using otherdict
operations like|=
.- member_names¶
A list of member names.
Added in version 3.13.
Supported__dunder__
names¶
__members__
is a read-only ordered mapping ofmember_name
:member
items. It is only available on the class.
__new__()
, if specified, must create and return the enum members;it is also a very good idea to set the member’s_value_
appropriately.Once all the members are created it is no longer used.
Supported_sunder_
names¶
_add_alias_()
– adds a new name as an alias to an existingmember._add_value_alias_()
– adds a new value as an alias to anexisting member._name_
– name of the member_value_
– value of the member; can be set in__new__
_missing_()
– a lookup function used when a value is not found;may be overridden_ignore_
– a list of names, either as alist
or astr
, that will not be transformed into members, and will be removedfrom the final class_order_
– no longer used, kept for backwardcompatibility (class attribute, removed during class creation)_generate_next_value_()
– used to get an appropriate value foran enum member; may be overriddenWhile
_sunder_
names are generally reserved for the further developmentof theEnum
class and can not be used, some are explicitly allowed:_repr_*
(e.g._repr_html_
), as used inIPython’s rich display
Added in version 3.6:_missing_
,_order_
,_generate_next_value_
Added in version 3.7:_ignore_
Added in version 3.13:_add_alias_
,_add_value_alias_
,_repr_*
Utilities and Decorators¶
- classenum.auto¶
auto can be used in place of a value. If used, theEnum machinery willcall an
Enum
’s_generate_next_value_()
to get an appropriate value.ForEnum
andIntEnum
that appropriate value will be the last value plusone; forFlag
andIntFlag
it will be the first power-of-two greaterthan the highest value; forStrEnum
it will be the lower-cased version ofthe member’s name. Care must be taken if mixingauto() with manuallyspecified values.auto instances are only resolved when at the top level of an assignment:
FIRST=auto()
will work (auto() is replaced with1
);SECOND=auto(),-2
will work (auto is replaced with2
, so2,-2
isused to create theSECOND
enum member;THREE=[auto(),-3]
willnot work (<autoinstance>,-3
is used tocreate theTHREE
enum member)
Changed in version 3.11.1:In prior versions,
auto()
had to be the only thingon the assignment line to work properly._generate_next_value_
can be overridden to customize the values used byauto.Note
in 3.13 the default
_generate_next_value_
will always returnthe highest member value incremented by 1, and will fail if anymember is an incompatible type.
- @enum.property¶
A decorator similar to the built-inproperty, but specifically forenumerations. It allows member attributes to have the same names as membersthemselves.
Note
theproperty and the member must be defined in separate classes;for example, thevalue andname attributes are defined in theEnum class, andEnum subclasses can define members with thenames
value
andname
.Added in version 3.11.
- @enum.unique¶
A
class
decorator specifically for enumerations. It searches anenumeration’s__members__
, gathering any aliases it finds; if any arefoundValueError
is raised with the details:>>>fromenumimportEnum,unique>>>@unique...classMistake(Enum):...ONE=1...TWO=2...THREE=3...FOUR=3...Traceback (most recent call last):...ValueError:duplicate values found in <enum 'Mistake'>: FOUR -> THREE
- @enum.verify¶
A
class
decorator specifically for enumerations. Members fromEnumCheck
are used to specify which constraints should be checkedon the decorated enumeration.Added in version 3.11.
- @enum.member¶
A decorator for use in enums: its target will become a member.
Added in version 3.11.
- @enum.nonmember¶
A decorator for use in enums: its target will not become a member.
Added in version 3.11.
- @enum.global_enum¶
A decorator to change the
str()
andrepr()
of an enumto show its members as belonging to the module instead of its class.Should only be used when the enum members are exportedto the module global namespace (seere.RegexFlag
for an example).Added in version 3.11.
- enum.show_flag_values(value)¶
Return a list of all power-of-two integers contained in a flagvalue.
Added in version 3.11.
Notes¶
These three enum types are designed to be drop-in replacements for existinginteger- and string-based values; as such, they have extra limitations:
__str__
uses the value and not the name of the enum member
__format__
, because it uses__str__
, will also use the value ofthe enum member instead of its nameIf you do not need/want those limitations, you can either create your ownbase class by mixing in the
int
orstr
type yourself:>>>fromenumimportEnum>>>classMyIntEnum(int,Enum):...passor you can reassign the appropriate
str()
, etc., in your enum:>>>fromenumimportEnum,IntEnum>>>classMyIntEnum(IntEnum):...__str__=Enum.__str__