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
Coloris 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.REDisRED, the value ofColor.BLUEis3, etc.)
Module Contents¶
The
typefor 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
Flagmembership.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, andKEEPwhich 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.
StrEnumdefaults to the lower-cased version of the member name,while other Enums default to 1 and increase from there.Allows
Enummembers to have attributes without conflicting withmember names. Thevalueandnameattributes 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
obja member. Can be used as a decorator.Do not make
obja 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.
EnumTypeis 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.Added in version 3.11:Before 3.11
EnumTypewas calledEnumMeta, which is still available as an alias.- __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
clsenum 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 (
Flagonly).
- __contains__(cls,member)¶
Returns
Trueif member belongs to thecls:>>>some_var=Color.RED>>>some_varinColorTrue>>>Color.RED.valueinColorTrue
Changed in version 3.12:Before Python 3.12, a
TypeErroris 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>]
- classenum.Enum¶
Enum is the base class for allenum enumerations.
- name¶
The name used to define the
Enummember:>>>Color.BLUE.name'BLUE'
- value¶
The value given to the
Enummember:>>>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 useautoinstances and anappropriate value will be chosen for you. Seeautofor thedetails.While mutable/unhashable values, such as
dict,listora 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__:>>>fromenumimportEnum>>>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,Enum>>>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:
>>>fromenumimportauto,StrEnum>>>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 of26for 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:
>>>fromenumimportauto,Enum>>>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:
>>>fromenumimportauto,Enum>>>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:>>>fromenumimportauto,Enum>>>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
- _add_alias_()¶
Adds a new name as an alias to an existing member:
>>>Color.RED._add_alias_("ERROR")>>>Color.ERROR<Color.RED: 1>
Raises a
NameErrorif the name is already assigned to a different member.Added in version 3.13.
- _add_value_alias_()¶
Adds a new value as an alias to an existing member:
>>>Color.RED._add_value_alias_(42)>>>Color(42)<Color.RED: 1>
Raises a
ValueErrorif the value is already linked with a different member.Added in version 3.13.
- 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 as
Enum, but its members are also strings andcan be used in most of the same places that a string can be used. The resultof any string operation performed on or with aStrEnum member is not partof the enumeration.>>>fromenumimportStrEnum,auto>>>classColor(StrEnum):...RED='r'...GREEN='g'...BLUE='b'...UNKNOWN=auto()...>>>Color.RED<Color.RED: 'r'>>>>Color.UNKNOWN<Color.UNKNOWN: 'unknown'>>>>str(Color.UNKNOWN)'unknown'
Note
There are places in the stdlib that check for an exact
strinstead of astrsubclass (i.e.type(unknown)==strinstead ofisinstance(unknown,str)), and in those locations youwill need to usestr(MyStrEnum.MY_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¶
Flagis 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¶
IntFlagis 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
Flagoperation 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
FlagBoundarysetting
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
IntFlagnow returns a positive value that is theunion of all flags not in the given flag, rather than a negative value.This matches the existingFlagbehavior.
- classenum.ReprEnum¶
ReprEnumuses therepr()ofEnum,but thestr()of the mixed-in data type:Inherit from
ReprEnumto 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¶
FlagBoundarycontrols how out-of-range values are handled inFlagand itssubclasses.- STRICT¶
Out-of-range values cause a
ValueErrorto 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
Flagvalue:>>>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
Flagmembership 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
Flagmembership 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
dictthat is used as the namespacefor defining enum classes (seePreparing the class namespace).It is exposed to allow subclasses ofEnumTypewith 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
MutableMappinginterface(__setitem__()andupdate()) is overridden.It may be possible to bypass the checks using otherdictoperations 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:memberitems. 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¶
_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 alistor 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 overridden_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.While
_sunder_names are generally reserved for the further developmentof theEnumclass 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.ForEnumandIntEnumthat appropriate value will be the last value plusone; forFlagandIntFlagit will be the first power-of-two greaterthan the highest value; forStrEnumit 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(),-2will work (auto is replaced with2, so2,-2isused to create theSECONDenum member;THREE=[auto(),-3]willnot work (<autoinstance>,-3is used tocreate theTHREEenum 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
valueandname.Added in version 3.11.
- @enum.unique¶
A
classdecorator specifically for enumerations. It searches anenumeration’s__members__, gathering any aliases it finds; if any arefoundValueErroris 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
classdecorator specifically for enumerations. Members fromEnumCheckare 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.RegexFlagfor 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
intorstrtype yourself:>>>fromenumimportEnum>>>classMyIntEnum(int,Enum):...passor you can reassign the appropriate
str(), etc., in your enum:>>>fromenumimportEnum,IntEnum>>>classMyIntEnum(IntEnum):...__str__=Enum.__str__