blob: a0b078c971706bd697952672142bed28c77a6d6b [file] [log] [blame]
Ethan Furman6b3d64a2013-06-14 16:55:46 -07001:mod:`enum` --- Support for enumerations
2========================================
3
4.. module:: enum
Brett Cannon15e489f2013-06-14 21:59:16 -04005 :synopsis: Implementation of an enumeration class.
6
Andrés Delfino2d748382018-07-07 16:01:25 -03007.. moduleauthor:: Ethan Furman <ethan@stoneleaf.us>
8.. sectionauthor:: Barry Warsaw <barry@python.org>
9.. sectionauthor:: Eli Bendersky <eliben@gmail.com>
10.. sectionauthor:: Ethan Furman <ethan@stoneleaf.us>
Ethan Furman6b3d64a2013-06-14 16:55:46 -070011
R David Murrayfd1ff1c2013-12-20 14:20:49 -050012.. versionadded:: 3.4
13
Ethan Furman6b3d64a2013-06-14 16:55:46 -070014**Source code:** :source:`Lib/enum.py`
15
16----------------
17
Ethan Furmanc72e6382014-02-06 08:13:14 -080018An enumeration is a set of symbolic names (members) bound to unique,
19constant values. Within an enumeration, the members can be compared
20by identity, and the enumeration itself can be iterated over.
21
Ethan Furman542e1df2020-09-14 13:32:44 -070022.. note:: Case of Enum Members
23
24 Because Enums are used to represent constants we recommend using
25 UPPER_CASE names for enum members, and will be using that style
26 in our examples.
27
Ethan Furmanc72e6382014-02-06 08:13:14 -080028
29Module Contents
30---------------
Ethan Furman6b3d64a2013-06-14 16:55:46 -070031
Ethan Furman65a5a472016-09-01 23:55:19 -070032This module defines four enumeration classes that can be used to define unique
Kartik Anand62658422017-03-01 01:37:19 +053033sets of names and values: :class:`Enum`, :class:`IntEnum`, :class:`Flag`, and
34:class:`IntFlag`. It also defines one decorator, :func:`unique`, and one
Ethan Furmanc16595e2016-09-10 23:36:59 -070035helper, :class:`auto`.
Ethan Furmanc72e6382014-02-06 08:13:14 -080036
37.. class:: Enum
38
39 Base class for creating enumerated constants. See section
Larry Hastingsad88d7a2014-02-10 04:26:10 -080040 `Functional API`_ for an alternate construction syntax.
Ethan Furmanc72e6382014-02-06 08:13:14 -080041
42.. class:: IntEnum
43
44 Base class for creating enumerated constants that are also
45 subclasses of :class:`int`.
46
Ethan Furman0063ff42020-09-21 17:23:13 -070047.. class:: StrEnum
48
49 Base class for creating enumerated constants that are also
50 subclasses of :class:`str`.
51
Ethan Furman65a5a472016-09-01 23:55:19 -070052.. class:: IntFlag
53
54 Base class for creating enumerated constants that can be combined using
55 the bitwise operators without losing their :class:`IntFlag` membership.
56 :class:`IntFlag` members are also subclasses of :class:`int`.
57
58.. class:: Flag
59
60 Base class for creating enumerated constants that can be combined using
61 the bitwise operations without losing their :class:`Flag` membership.
62
Ethan Furmanc72e6382014-02-06 08:13:14 -080063.. function:: unique
Victor Stinnerd3ded082020-08-13 21:41:54 +020064 :noindex:
Ethan Furmanc72e6382014-02-06 08:13:14 -080065
66 Enum class decorator that ensures only one name is bound to any one value.
Ethan Furmanf24bb352013-07-18 17:05:39 -070067
Ethan Furmanc16595e2016-09-10 23:36:59 -070068.. class:: auto
69
Ethan Furmanefb13be2020-12-10 12:20:06 -080070 Instances are replaced with an appropriate value for Enum members.
71 :class:`StrEnum` defaults to the lower-cased version of the member name,
72 while other Enums default to 1 and increase from there.
Ethan Furmanc16595e2016-09-10 23:36:59 -070073
74.. versionadded:: 3.6 ``Flag``, ``IntFlag``, ``auto``
Ethan Furmanefb13be2020-12-10 12:20:06 -080075.. versionadded:: 3.10 ``StrEnum``
Ethan Furman6b3d64a2013-06-14 16:55:46 -070076
77Creating an Enum
78----------------
79
80Enumerations are created using the :keyword:`class` syntax, which makes them
81easy to read and write. An alternative creation method is described in
Ethan Furman332dbc72016-08-20 00:00:52 -070082`Functional API`_. To define an enumeration, subclass :class:`Enum` as
83follows::
Ethan Furman6b3d64a2013-06-14 16:55:46 -070084
Ethan Furman332dbc72016-08-20 00:00:52 -070085 >>> from enum import Enum
86 >>> class Color(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -080087 ... RED = 1
88 ... GREEN = 2
89 ... BLUE = 3
Ethan Furmaned0bf8a2013-09-06 19:53:30 -070090 ...
Ethan Furman6b3d64a2013-06-14 16:55:46 -070091
Ethan Furmanc16595e2016-09-10 23:36:59 -070092.. note:: Enum member values
93
94 Member values can be anything: :class:`int`, :class:`str`, etc.. If
95 the exact value is unimportant you may use :class:`auto` instances and an
96 appropriate value will be chosen for you. Care must be taken if you mix
97 :class:`auto` with other values.
98
Ethan Furman455bfde2013-09-08 23:48:34 -070099.. note:: Nomenclature
100
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700101 - The class :class:`Color` is an *enumeration* (or *enum*)
Ethan Furman23bb6f42016-11-21 09:22:05 -0800102 - The attributes :attr:`Color.RED`, :attr:`Color.GREEN`, etc., are
103 *enumeration members* (or *enum members*) and are functionally constants.
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700104 - The enum members have *names* and *values* (the name of
Ethan Furman23bb6f42016-11-21 09:22:05 -0800105 :attr:`Color.RED` is ``RED``, the value of :attr:`Color.BLUE` is
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700106 ``3``, etc.)
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700107
Ethan Furman9a1daf52013-09-27 22:58:06 -0700108.. note::
109
110 Even though we use the :keyword:`class` syntax to create Enums, Enums
111 are not normal Python classes. See `How are Enums different?`_ for
112 more details.
113
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700114Enumeration members have human readable string representations::
115
Ethan Furman23bb6f42016-11-21 09:22:05 -0800116 >>> print(Color.RED)
117 Color.RED
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700118
119...while their ``repr`` has more information::
120
Ethan Furman23bb6f42016-11-21 09:22:05 -0800121 >>> print(repr(Color.RED))
122 <Color.RED: 1>
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700123
124The *type* of an enumeration member is the enumeration it belongs to::
125
Ethan Furman23bb6f42016-11-21 09:22:05 -0800126 >>> type(Color.RED)
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700127 <enum 'Color'>
Ethan Furman23bb6f42016-11-21 09:22:05 -0800128 >>> isinstance(Color.GREEN, Color)
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700129 True
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700130
131Enum members also have a property that contains just their item name::
132
Ethan Furman23bb6f42016-11-21 09:22:05 -0800133 >>> print(Color.RED.name)
134 RED
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700135
136Enumerations support iteration, in definition order::
137
138 >>> class Shake(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800139 ... VANILLA = 7
140 ... CHOCOLATE = 4
141 ... COOKIES = 9
142 ... MINT = 3
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700143 ...
144 >>> for shake in Shake:
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700145 ... print(shake)
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700146 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800147 Shake.VANILLA
148 Shake.CHOCOLATE
149 Shake.COOKIES
150 Shake.MINT
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700151
152Enumeration members are hashable, so they can be used in dictionaries and sets::
153
154 >>> apples = {}
Ethan Furman23bb6f42016-11-21 09:22:05 -0800155 >>> apples[Color.RED] = 'red delicious'
156 >>> apples[Color.GREEN] = 'granny smith'
157 >>> apples == {Color.RED: 'red delicious', Color.GREEN: 'granny smith'}
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700158 True
159
160
Ethan Furman3fe70b4a2013-06-28 14:02:34 -0700161Programmatic access to enumeration members and their attributes
162---------------------------------------------------------------
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700163
164Sometimes it's useful to access members in enumerations programmatically (i.e.
Ethan Furman23bb6f42016-11-21 09:22:05 -0800165situations where ``Color.RED`` won't do because the exact color is not known
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700166at program-writing time). ``Enum`` allows such access::
167
168 >>> Color(1)
Ethan Furman23bb6f42016-11-21 09:22:05 -0800169 <Color.RED: 1>
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700170 >>> Color(3)
Ethan Furman23bb6f42016-11-21 09:22:05 -0800171 <Color.BLUE: 3>
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700172
173If you want to access enum members by *name*, use item access::
174
Ethan Furman23bb6f42016-11-21 09:22:05 -0800175 >>> Color['RED']
176 <Color.RED: 1>
177 >>> Color['GREEN']
178 <Color.GREEN: 2>
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700179
Larry Hastings3732ed22014-03-15 21:13:56 -0700180If you have an enum member and need its :attr:`name` or :attr:`value`::
Ethan Furman3fe70b4a2013-06-28 14:02:34 -0700181
Ethan Furman23bb6f42016-11-21 09:22:05 -0800182 >>> member = Color.RED
Ethan Furman3fe70b4a2013-06-28 14:02:34 -0700183 >>> member.name
Ethan Furman23bb6f42016-11-21 09:22:05 -0800184 'RED'
Ethan Furman3fe70b4a2013-06-28 14:02:34 -0700185 >>> member.value
186 1
187
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700188
189Duplicating enum members and values
190-----------------------------------
191
192Having two enum members with the same name is invalid::
193
194 >>> class Shape(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800195 ... SQUARE = 2
196 ... SQUARE = 3
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700197 ...
198 Traceback (most recent call last):
199 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800200 TypeError: Attempted to reuse key: 'SQUARE'
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700201
202However, two enum members are allowed to have the same value. Given two members
203A and B with the same value (and A defined first), B is an alias to A. By-value
204lookup of the value of A and B will return A. By-name lookup of B will also
205return A::
206
207 >>> class Shape(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800208 ... SQUARE = 2
209 ... DIAMOND = 1
210 ... CIRCLE = 3
211 ... ALIAS_FOR_SQUARE = 2
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700212 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800213 >>> Shape.SQUARE
214 <Shape.SQUARE: 2>
215 >>> Shape.ALIAS_FOR_SQUARE
216 <Shape.SQUARE: 2>
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700217 >>> Shape(2)
Ethan Furman23bb6f42016-11-21 09:22:05 -0800218 <Shape.SQUARE: 2>
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700219
Ethan Furman101e0742013-09-15 12:34:36 -0700220.. note::
221
222 Attempting to create a member with the same name as an already
223 defined attribute (another member, a method, etc.) or attempting to create
224 an attribute with the same name as a member is not allowed.
225
Ethan Furmanf24bb352013-07-18 17:05:39 -0700226
227Ensuring unique enumeration values
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700228----------------------------------
Ethan Furmanf24bb352013-07-18 17:05:39 -0700229
230By default, enumerations allow multiple names as aliases for the same value.
231When this behavior isn't desired, the following decorator can be used to
232ensure each value is used only once in the enumeration:
233
234.. decorator:: unique
235
236A :keyword:`class` decorator specifically for enumerations. It searches an
237enumeration's :attr:`__members__` gathering any aliases it finds; if any are
238found :exc:`ValueError` is raised with the details::
239
240 >>> from enum import Enum, unique
241 >>> @unique
242 ... class Mistake(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800243 ... ONE = 1
244 ... TWO = 2
245 ... THREE = 3
246 ... FOUR = 3
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700247 ...
Ethan Furmanf24bb352013-07-18 17:05:39 -0700248 Traceback (most recent call last):
249 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800250 ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
Ethan Furmanf24bb352013-07-18 17:05:39 -0700251
252
Ethan Furmanc16595e2016-09-10 23:36:59 -0700253Using automatic values
254----------------------
255
256If the exact value is unimportant you can use :class:`auto`::
257
258 >>> from enum import Enum, auto
259 >>> class Color(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800260 ... RED = auto()
261 ... BLUE = auto()
262 ... GREEN = auto()
Ethan Furmanc16595e2016-09-10 23:36:59 -0700263 ...
264 >>> list(Color)
Ethan Furman23bb6f42016-11-21 09:22:05 -0800265 [<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]
Ethan Furmanc16595e2016-09-10 23:36:59 -0700266
267The values are chosen by :func:`_generate_next_value_`, which can be
268overridden::
269
270 >>> class AutoName(Enum):
271 ... def _generate_next_value_(name, start, count, last_values):
272 ... return name
273 ...
274 >>> class Ordinal(AutoName):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800275 ... NORTH = auto()
276 ... SOUTH = auto()
277 ... EAST = auto()
278 ... WEST = auto()
Ethan Furmanc16595e2016-09-10 23:36:59 -0700279 ...
280 >>> list(Ordinal)
Ethan Furman23bb6f42016-11-21 09:22:05 -0800281 [<Ordinal.NORTH: 'NORTH'>, <Ordinal.SOUTH: 'SOUTH'>, <Ordinal.EAST: 'EAST'>, <Ordinal.WEST: 'WEST'>]
Ethan Furmanc16595e2016-09-10 23:36:59 -0700282
283.. note::
284
285 The goal of the default :meth:`_generate_next_value_` methods is to provide
286 the next :class:`int` in sequence with the last :class:`int` provided, but
287 the way it does this is an implementation detail and may change.
288
Ethan Onstottd9a43e22020-04-28 13:20:55 -0400289.. note::
290
291 The :meth:`_generate_next_value_` method must be defined before any members.
292
Ethan Furmanf24bb352013-07-18 17:05:39 -0700293Iteration
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700294---------
Ethan Furmanf24bb352013-07-18 17:05:39 -0700295
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700296Iterating over the members of an enum does not provide the aliases::
297
298 >>> list(Shape)
Ethan Furman23bb6f42016-11-21 09:22:05 -0800299 [<Shape.SQUARE: 2>, <Shape.DIAMOND: 1>, <Shape.CIRCLE: 3>]
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700300
INADA Naokie57f91a2018-06-19 01:14:26 +0900301The special attribute ``__members__`` is a read-only ordered mapping of names
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700302to members. It includes all names defined in the enumeration, including the
303aliases::
304
305 >>> for name, member in Shape.__members__.items():
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700306 ... name, member
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700307 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800308 ('SQUARE', <Shape.SQUARE: 2>)
309 ('DIAMOND', <Shape.DIAMOND: 1>)
310 ('CIRCLE', <Shape.CIRCLE: 3>)
311 ('ALIAS_FOR_SQUARE', <Shape.SQUARE: 2>)
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700312
313The ``__members__`` attribute can be used for detailed programmatic access to
314the enumeration members. For example, finding all the aliases::
315
Ethan Furman332dbc72016-08-20 00:00:52 -0700316 >>> [name for name, member in Shape.__members__.items() if member.name != name]
Ethan Furman23bb6f42016-11-21 09:22:05 -0800317 ['ALIAS_FOR_SQUARE']
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700318
Ethan Furmanf24bb352013-07-18 17:05:39 -0700319
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700320Comparisons
321-----------
322
323Enumeration members are compared by identity::
324
Ethan Furman23bb6f42016-11-21 09:22:05 -0800325 >>> Color.RED is Color.RED
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700326 True
Ethan Furman23bb6f42016-11-21 09:22:05 -0800327 >>> Color.RED is Color.BLUE
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700328 False
Ethan Furman23bb6f42016-11-21 09:22:05 -0800329 >>> Color.RED is not Color.BLUE
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700330 True
331
332Ordered comparisons between enumeration values are *not* supported. Enum
333members are not integers (but see `IntEnum`_ below)::
334
Ethan Furman23bb6f42016-11-21 09:22:05 -0800335 >>> Color.RED < Color.BLUE
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700336 Traceback (most recent call last):
337 File "<stdin>", line 1, in <module>
Ethan Furmane8e61272016-08-20 07:19:31 -0700338 TypeError: '<' not supported between instances of 'Color' and 'Color'
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700339
340Equality comparisons are defined though::
341
Ethan Furman23bb6f42016-11-21 09:22:05 -0800342 >>> Color.BLUE == Color.RED
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700343 False
Ethan Furman23bb6f42016-11-21 09:22:05 -0800344 >>> Color.BLUE != Color.RED
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700345 True
Ethan Furman23bb6f42016-11-21 09:22:05 -0800346 >>> Color.BLUE == Color.BLUE
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700347 True
348
349Comparisons against non-enumeration values will always compare not equal
Ezio Melotti93d7dda2013-10-05 04:13:18 +0300350(again, :class:`IntEnum` was explicitly designed to behave differently, see
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700351below)::
352
Ethan Furman23bb6f42016-11-21 09:22:05 -0800353 >>> Color.BLUE == 2
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700354 False
355
356
357Allowed members and attributes of enumerations
358----------------------------------------------
359
360The examples above use integers for enumeration values. Using integers is
Ethan Furman332dbc72016-08-20 00:00:52 -0700361short and handy (and provided by default by the `Functional API`_), but not
362strictly enforced. In the vast majority of use-cases, one doesn't care what
363the actual value of an enumeration is. But if the value *is* important,
364enumerations can have arbitrary values.
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700365
366Enumerations are Python classes, and can have methods and special methods as
367usual. If we have this enumeration::
368
369 >>> class Mood(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800370 ... FUNKY = 1
371 ... HAPPY = 3
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700372 ...
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700373 ... def describe(self):
374 ... # self is the member here
375 ... return self.name, self.value
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700376 ...
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700377 ... def __str__(self):
378 ... return 'my custom str! {0}'.format(self.value)
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700379 ...
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700380 ... @classmethod
381 ... def favorite_mood(cls):
382 ... # cls here is the enumeration
Ethan Furman23bb6f42016-11-21 09:22:05 -0800383 ... return cls.HAPPY
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700384 ...
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700385
386Then::
387
388 >>> Mood.favorite_mood()
Ethan Furman23bb6f42016-11-21 09:22:05 -0800389 <Mood.HAPPY: 3>
390 >>> Mood.HAPPY.describe()
391 ('HAPPY', 3)
392 >>> str(Mood.FUNKY)
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700393 'my custom str! 1'
394
Martin Pantera90a4a92016-05-30 04:04:50 +0000395The rules for what is allowed are as follows: names that start and end with
396a single underscore are reserved by enum and cannot be used; all other
Ethan Furman8be6fac2014-11-01 07:40:22 -0700397attributes defined within an enumeration will become members of this
398enumeration, with the exception of special methods (:meth:`__str__`,
Ethan Furmana4b1bb42018-01-22 07:56:37 -0800399:meth:`__add__`, etc.), descriptors (methods are also descriptors), and
400variable names listed in :attr:`_ignore_`.
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700401
402Note: if your enumeration defines :meth:`__new__` and/or :meth:`__init__` then
Antoined3c8d732019-08-20 03:41:31 +0200403any value(s) given to the enum member will be passed into those methods.
404See `Planet`_ for an example.
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700405
406
Ethan Furman5bdab642018-09-21 19:03:09 -0700407Restricted Enum subclassing
408---------------------------
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700409
Ethan Furman5bdab642018-09-21 19:03:09 -0700410A new :class:`Enum` class must have one base Enum class, up to one concrete
411data type, and as many :class:`object`-based mixin classes as needed. The
412order of these base classes is::
413
nu_nodfc8bb92019-01-27 23:07:47 +0100414 class EnumName([mix-in, ...,] [data-type,] base-enum):
Ethan Furman5bdab642018-09-21 19:03:09 -0700415 pass
416
417Also, subclassing an enumeration is allowed only if the enumeration does not define
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700418any members. So this is forbidden::
419
420 >>> class MoreColor(Color):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800421 ... PINK = 17
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700422 ...
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700423 Traceback (most recent call last):
424 ...
425 TypeError: Cannot extend enumerations
426
427But this is allowed::
428
429 >>> class Foo(Enum):
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700430 ... def some_behavior(self):
431 ... pass
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700432 ...
433 >>> class Bar(Foo):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800434 ... HAPPY = 1
435 ... SAD = 2
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700436 ...
437
438Allowing subclassing of enums that define members would lead to a violation of
439some important invariants of types and instances. On the other hand, it makes
440sense to allow sharing some common behavior between a group of enumerations.
441(See `OrderedEnum`_ for an example.)
442
443
444Pickling
445--------
446
447Enumerations can be pickled and unpickled::
448
449 >>> from test.test_enum import Fruit
450 >>> from pickle import dumps, loads
Ethan Furman23bb6f42016-11-21 09:22:05 -0800451 >>> Fruit.TOMATO is loads(dumps(Fruit.TOMATO))
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700452 True
453
454The usual restrictions for pickling apply: picklable enums must be defined in
455the top level of a module, since unpickling requires them to be importable
456from that module.
457
Ethan Furmanca1b7942014-02-08 11:36:27 -0800458.. note::
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700459
Ethan Furmanca1b7942014-02-08 11:36:27 -0800460 With pickle protocol version 4 it is possible to easily pickle enums
461 nested in other classes.
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700462
Ethan Furman2da95042014-03-03 12:42:52 -0800463It is possible to modify how Enum members are pickled/unpickled by defining
464:meth:`__reduce_ex__` in the enumeration class.
465
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700466
467Functional API
468--------------
469
470The :class:`Enum` class is callable, providing the following functional API::
471
Ethan Furman23bb6f42016-11-21 09:22:05 -0800472 >>> Animal = Enum('Animal', 'ANT BEE CAT DOG')
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700473 >>> Animal
474 <enum 'Animal'>
Ethan Furman23bb6f42016-11-21 09:22:05 -0800475 >>> Animal.ANT
476 <Animal.ANT: 1>
477 >>> Animal.ANT.value
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700478 1
479 >>> list(Animal)
Ethan Furman23bb6f42016-11-21 09:22:05 -0800480 [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700481
Ethan Furman332dbc72016-08-20 00:00:52 -0700482The semantics of this API resemble :class:`~collections.namedtuple`. The first
483argument of the call to :class:`Enum` is the name of the enumeration.
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700484
Ethan Furman332dbc72016-08-20 00:00:52 -0700485The second argument is the *source* of enumeration member names. It can be a
486whitespace-separated string of names, a sequence of names, a sequence of
4872-tuples with key/value pairs, or a mapping (e.g. dictionary) of names to
488values. The last two options enable assigning arbitrary values to
489enumerations; the others auto-assign increasing integers starting with 1 (use
490the ``start`` parameter to specify a different starting value). A
491new class derived from :class:`Enum` is returned. In other words, the above
492assignment to :class:`Animal` is equivalent to::
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700493
Ethan Furman8a123292015-01-14 22:31:50 -0800494 >>> class Animal(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800495 ... ANT = 1
496 ... BEE = 2
497 ... CAT = 3
498 ... DOG = 4
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700499 ...
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700500
Ethan Furmane2563462013-06-28 19:37:17 -0700501The reason for defaulting to ``1`` as the starting number and not ``0`` is
502that ``0`` is ``False`` in a boolean sense, but enum members all evaluate
503to ``True``.
504
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700505Pickling enums created with the functional API can be tricky as frame stack
506implementation details are used to try and figure out which module the
507enumeration is being created in (e.g. it will fail if you use a utility
Ethan Furman332dbc72016-08-20 00:00:52 -0700508function in separate module, and also may not work on IronPython or Jython).
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700509The solution is to specify the module name explicitly as follows::
510
Ethan Furman23bb6f42016-11-21 09:22:05 -0800511 >>> Animal = Enum('Animal', 'ANT BEE CAT DOG', module=__name__)
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700512
Ethan Furman2da95042014-03-03 12:42:52 -0800513.. warning::
514
Ethan Furman01cc2d52014-03-03 15:02:04 -0800515 If ``module`` is not supplied, and Enum cannot determine what it is,
Ethan Furman2da95042014-03-03 12:42:52 -0800516 the new Enum members will not be unpicklable; to keep errors closer to
517 the source, pickling will be disabled.
518
Ethan Furmanca1b7942014-02-08 11:36:27 -0800519The new pickle protocol 4 also, in some circumstances, relies on
Martin Panterbae5d812016-06-18 03:57:31 +0000520:attr:`~definition.__qualname__` being set to the location where pickle will be able
Ethan Furmanca1b7942014-02-08 11:36:27 -0800521to find the class. For example, if the class was made available in class
522SomeData in the global scope::
523
Ethan Furman23bb6f42016-11-21 09:22:05 -0800524 >>> Animal = Enum('Animal', 'ANT BEE CAT DOG', qualname='SomeData.Animal')
Ethan Furmanca1b7942014-02-08 11:36:27 -0800525
Ethan Furman2da95042014-03-03 12:42:52 -0800526The complete signature is::
527
Ethan Furman332dbc72016-08-20 00:00:52 -0700528 Enum(value='NewEnumName', names=<...>, *, module='...', qualname='...', type=<mixed-in class>, start=1)
Ethan Furman2da95042014-03-03 12:42:52 -0800529
Ethan Furman01cc2d52014-03-03 15:02:04 -0800530:value: What the new Enum class will record as its name.
Ethan Furman2da95042014-03-03 12:42:52 -0800531
Zachary Waredbd1c432014-03-20 10:01:48 -0500532:names: The Enum members. This can be a whitespace or comma separated string
Ethan Furmand9925a12014-09-16 20:35:55 -0700533 (values will start at 1 unless otherwise specified)::
Ethan Furman2da95042014-03-03 12:42:52 -0800534
Ethan Furman23bb6f42016-11-21 09:22:05 -0800535 'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE'
Ethan Furman2da95042014-03-03 12:42:52 -0800536
Ethan Furman8a123292015-01-14 22:31:50 -0800537 or an iterator of names::
538
Ethan Furman23bb6f42016-11-21 09:22:05 -0800539 ['RED', 'GREEN', 'BLUE']
Ethan Furman8a123292015-01-14 22:31:50 -0800540
Ethan Furman01cc2d52014-03-03 15:02:04 -0800541 or an iterator of (name, value) pairs::
Ethan Furman2da95042014-03-03 12:42:52 -0800542
Ethan Furman23bb6f42016-11-21 09:22:05 -0800543 [('CYAN', 4), ('MAGENTA', 5), ('YELLOW', 6)]
Ethan Furman2da95042014-03-03 12:42:52 -0800544
Ethan Furman01cc2d52014-03-03 15:02:04 -0800545 or a mapping::
Ethan Furman2da95042014-03-03 12:42:52 -0800546
Ethan Furman23bb6f42016-11-21 09:22:05 -0800547 {'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42}
Ethan Furman2da95042014-03-03 12:42:52 -0800548
Ethan Furman01cc2d52014-03-03 15:02:04 -0800549:module: name of module where new Enum class can be found.
Ethan Furman2da95042014-03-03 12:42:52 -0800550
Ethan Furman01cc2d52014-03-03 15:02:04 -0800551:qualname: where in module new Enum class can be found.
Ethan Furman2da95042014-03-03 12:42:52 -0800552
Ethan Furman01cc2d52014-03-03 15:02:04 -0800553:type: type to mix in to new Enum class.
Ethan Furman2da95042014-03-03 12:42:52 -0800554
Yury Selivanov4dde5872015-09-11 00:48:21 -0400555:start: number to start counting at if only names are passed in.
Ethan Furmand9925a12014-09-16 20:35:55 -0700556
Berker Peksag60efd792014-09-18 05:23:14 +0300557.. versionchanged:: 3.5
558 The *start* parameter was added.
559
Ethan Furmanca1b7942014-02-08 11:36:27 -0800560
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700561Derived Enumerations
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700562--------------------
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700563
564IntEnum
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700565^^^^^^^
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700566
Ethan Furman65a5a472016-09-01 23:55:19 -0700567The first variation of :class:`Enum` that is provided is also a subclass of
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700568:class:`int`. Members of an :class:`IntEnum` can be compared to integers;
569by extension, integer enumerations of different types can also be compared
570to each other::
571
572 >>> from enum import IntEnum
573 >>> class Shape(IntEnum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800574 ... CIRCLE = 1
575 ... SQUARE = 2
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700576 ...
577 >>> class Request(IntEnum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800578 ... POST = 1
579 ... GET = 2
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700580 ...
581 >>> Shape == 1
582 False
Ethan Furman23bb6f42016-11-21 09:22:05 -0800583 >>> Shape.CIRCLE == 1
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700584 True
Ethan Furman23bb6f42016-11-21 09:22:05 -0800585 >>> Shape.CIRCLE == Request.POST
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700586 True
587
588However, they still can't be compared to standard :class:`Enum` enumerations::
589
590 >>> class Shape(IntEnum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800591 ... CIRCLE = 1
592 ... SQUARE = 2
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700593 ...
594 >>> class Color(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800595 ... RED = 1
596 ... GREEN = 2
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700597 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800598 >>> Shape.CIRCLE == Color.RED
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700599 False
600
601:class:`IntEnum` values behave like integers in other ways you'd expect::
602
Ethan Furman23bb6f42016-11-21 09:22:05 -0800603 >>> int(Shape.CIRCLE)
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700604 1
Ethan Furman23bb6f42016-11-21 09:22:05 -0800605 >>> ['a', 'b', 'c'][Shape.CIRCLE]
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700606 'b'
Ethan Furman23bb6f42016-11-21 09:22:05 -0800607 >>> [i for i in range(Shape.SQUARE)]
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700608 [0, 1]
609
Ethan Furman65a5a472016-09-01 23:55:19 -0700610
Ethan Furman0063ff42020-09-21 17:23:13 -0700611StrEnum
612^^^^^^^
613
614The second variation of :class:`Enum` that is provided is also a subclass of
615:class:`str`. Members of a :class:`StrEnum` can be compared to strings;
616by extension, string enumerations of different types can also be compared
617to each other. :class:`StrEnum` exists to help avoid the problem of getting
618an incorrect member::
619
620 >>> class Directions(StrEnum):
621 ... NORTH = 'north', # notice the trailing comma
622 ... SOUTH = 'south'
623
624Before :class:`StrEnum`, ``Directions.NORTH`` would have been the :class:`tuple`
625``('north',)``.
626
Ethan Furmand986d162020-09-22 13:00:07 -0700627.. note::
628
629 Unlike other Enum's, ``str(StrEnum.member)`` will return the value of the
630 member instead of the usual ``"EnumClass.member"``.
631
Ethan Furman0063ff42020-09-21 17:23:13 -0700632.. versionadded:: 3.10
633
634
Ethan Furman65a5a472016-09-01 23:55:19 -0700635IntFlag
636^^^^^^^
637
638The next variation of :class:`Enum` provided, :class:`IntFlag`, is also based
639on :class:`int`. The difference being :class:`IntFlag` members can be combined
640using the bitwise operators (&, \|, ^, ~) and the result is still an
641:class:`IntFlag` member. However, as the name implies, :class:`IntFlag`
Ethan Furman54924df2016-09-07 23:40:31 -0700642members also subclass :class:`int` and can be used wherever an :class:`int` is
643used. Any operation on an :class:`IntFlag` member besides the bit-wise
644operations will lose the :class:`IntFlag` membership.
Ethan Furman65a5a472016-09-01 23:55:19 -0700645
Ethan Furman25d94bb2016-09-02 16:32:32 -0700646.. versionadded:: 3.6
647
648Sample :class:`IntFlag` class::
649
Ethan Furman65a5a472016-09-01 23:55:19 -0700650 >>> from enum import IntFlag
651 >>> class Perm(IntFlag):
652 ... R = 4
653 ... W = 2
654 ... X = 1
655 ...
656 >>> Perm.R | Perm.W
657 <Perm.R|W: 6>
658 >>> Perm.R + Perm.W
659 6
660 >>> RW = Perm.R | Perm.W
661 >>> Perm.R in RW
662 True
663
Ethan Furman25d94bb2016-09-02 16:32:32 -0700664It is also possible to name the combinations::
665
666 >>> class Perm(IntFlag):
667 ... R = 4
668 ... W = 2
669 ... X = 1
670 ... RWX = 7
671 >>> Perm.RWX
672 <Perm.RWX: 7>
673 >>> ~Perm.RWX
Ethan Furman27682d22016-09-04 11:39:01 -0700674 <Perm.-8: -8>
Ethan Furman25d94bb2016-09-02 16:32:32 -0700675
676Another important difference between :class:`IntFlag` and :class:`Enum` is that
677if no flags are set (the value is 0), its boolean evaluation is :data:`False`::
678
679 >>> Perm.R & Perm.X
680 <Perm.0: 0>
681 >>> bool(Perm.R & Perm.X)
682 False
683
684Because :class:`IntFlag` members are also subclasses of :class:`int` they can
685be combined with them::
686
687 >>> Perm.X | 8
688 <Perm.8|X: 9>
Ethan Furman65a5a472016-09-01 23:55:19 -0700689
Ethan Furman7219e272020-09-16 13:01:00 -0700690:class:`IntFlag` members can also be iterated over::
691
692 >>> list(RW)
693 [<Perm.R: 4>, <Perm.W: 2>]
694
695.. versionadded:: 3.10
696
Ethan Furman65a5a472016-09-01 23:55:19 -0700697
698Flag
699^^^^
700
701The last variation is :class:`Flag`. Like :class:`IntFlag`, :class:`Flag`
Ethan Furman25d94bb2016-09-02 16:32:32 -0700702members can be combined using the bitwise operators (&, \|, ^, ~). Unlike
Ethan Furman65a5a472016-09-01 23:55:19 -0700703:class:`IntFlag`, they cannot be combined with, nor compared against, any
Ethan Furmanc16595e2016-09-10 23:36:59 -0700704other :class:`Flag` enumeration, nor :class:`int`. While it is possible to
705specify the values directly it is recommended to use :class:`auto` as the
706value and let :class:`Flag` select an appropriate value.
Ethan Furman65a5a472016-09-01 23:55:19 -0700707
708.. versionadded:: 3.6
709
Ethan Furman25d94bb2016-09-02 16:32:32 -0700710Like :class:`IntFlag`, if a combination of :class:`Flag` members results in no
711flags being set, the boolean evaluation is :data:`False`::
712
Julian Kahnert0f31c742018-01-13 04:35:57 +0100713 >>> from enum import Flag, auto
Ethan Furman25d94bb2016-09-02 16:32:32 -0700714 >>> class Color(Flag):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800715 ... RED = auto()
716 ... BLUE = auto()
717 ... GREEN = auto()
Ethan Furman25d94bb2016-09-02 16:32:32 -0700718 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800719 >>> Color.RED & Color.GREEN
Ethan Furman25d94bb2016-09-02 16:32:32 -0700720 <Color.0: 0>
Ethan Furman23bb6f42016-11-21 09:22:05 -0800721 >>> bool(Color.RED & Color.GREEN)
Ethan Furman25d94bb2016-09-02 16:32:32 -0700722 False
723
Ethan Furman27682d22016-09-04 11:39:01 -0700724Individual flags should have values that are powers of two (1, 2, 4, 8, ...),
725while combinations of flags won't::
726
727 >>> class Color(Flag):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800728 ... RED = auto()
729 ... BLUE = auto()
730 ... GREEN = auto()
731 ... WHITE = RED | BLUE | GREEN
Ethan Furmanc16595e2016-09-10 23:36:59 -0700732 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800733 >>> Color.WHITE
734 <Color.WHITE: 7>
Ethan Furman27682d22016-09-04 11:39:01 -0700735
Ethan Furman25d94bb2016-09-02 16:32:32 -0700736Giving a name to the "no flags set" condition does not change its boolean
737value::
738
739 >>> class Color(Flag):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800740 ... BLACK = 0
741 ... RED = auto()
742 ... BLUE = auto()
743 ... GREEN = auto()
Ethan Furman25d94bb2016-09-02 16:32:32 -0700744 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800745 >>> Color.BLACK
746 <Color.BLACK: 0>
747 >>> bool(Color.BLACK)
Ethan Furman25d94bb2016-09-02 16:32:32 -0700748 False
749
Ethan Furman7219e272020-09-16 13:01:00 -0700750:class:`Flag` members can also be iterated over::
751
752 >>> purple = Color.RED | Color.BLUE
753 >>> list(purple)
754 [<Color.BLUE: 2>, <Color.RED: 1>]
755
756.. versionadded:: 3.10
757
Ethan Furman65a5a472016-09-01 23:55:19 -0700758.. note::
759
760 For the majority of new code, :class:`Enum` and :class:`Flag` are strongly
761 recommended, since :class:`IntEnum` and :class:`IntFlag` break some
762 semantic promises of an enumeration (by being comparable to integers, and
763 thus by transitivity to other unrelated enumerations). :class:`IntEnum`
764 and :class:`IntFlag` should be used only in cases where :class:`Enum` and
765 :class:`Flag` will not do; for example, when integer constants are replaced
766 with enumerations, or for interoperability with other systems.
Ethan Furman332dbc72016-08-20 00:00:52 -0700767
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700768
769Others
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700770^^^^^^
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700771
772While :class:`IntEnum` is part of the :mod:`enum` module, it would be very
773simple to implement independently::
774
775 class IntEnum(int, Enum):
776 pass
777
778This demonstrates how similar derived enumerations can be defined; for example
Ethan Furman332dbc72016-08-20 00:00:52 -0700779a :class:`StrEnum` that mixes in :class:`str` instead of :class:`int`.
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700780
781Some rules:
782
7831. When subclassing :class:`Enum`, mix-in types must appear before
784 :class:`Enum` itself in the sequence of bases, as in the :class:`IntEnum`
785 example above.
7862. While :class:`Enum` can have members of any type, once you mix in an
787 additional type, all the members must have values of that type, e.g.
788 :class:`int` above. This restriction does not apply to mix-ins which only
Antoined3c8d732019-08-20 03:41:31 +0200789 add methods and don't specify another type.
Ethan Furman6b3d64a2013-06-14 16:55:46 -07007903. When another data type is mixed in, the :attr:`value` attribute is *not the
Zachary Waredbd1c432014-03-20 10:01:48 -0500791 same* as the enum member itself, although it is equivalent and will compare
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700792 equal.
Martin Panterd5db1472016-02-08 01:34:09 +00007934. %-style formatting: `%s` and `%r` call the :class:`Enum` class's
794 :meth:`__str__` and :meth:`__repr__` respectively; other codes (such as
795 `%i` or `%h` for IntEnum) treat the enum member as its mixed-in type.
Martin Panterbc1ee462016-02-13 00:41:37 +00007965. :ref:`Formatted string literals <f-strings>`, :meth:`str.format`,
thatneat2f19e822019-07-04 11:28:37 -0700797 and :func:`format` will use the mixed-in type's :meth:`__format__`
798 unless :meth:`__str__` or :meth:`__format__` is overridden in the subclass,
799 in which case the overridden methods or :class:`Enum` methods will be used.
800 Use the !s and !r format codes to force usage of the :class:`Enum` class's
801 :meth:`__str__` and :meth:`__repr__` methods.
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700802
Ethan Furmanf5223742018-09-12 10:00:30 -0700803When to use :meth:`__new__` vs. :meth:`__init__`
804------------------------------------------------
805
806:meth:`__new__` must be used whenever you want to customize the actual value of
807the :class:`Enum` member. Any other modifications may go in either
808:meth:`__new__` or :meth:`__init__`, with :meth:`__init__` being preferred.
809
810For example, if you want to pass several items to the constructor, but only
811want one of them to be the value::
812
813 >>> class Coordinate(bytes, Enum):
814 ... """
815 ... Coordinate with binary codes that can be indexed by the int code.
816 ... """
817 ... def __new__(cls, value, label, unit):
818 ... obj = bytes.__new__(cls, [value])
819 ... obj._value_ = value
820 ... obj.label = label
821 ... obj.unit = unit
822 ... return obj
823 ... PX = (0, 'P.X', 'km')
824 ... PY = (1, 'P.Y', 'km')
825 ... VX = (2, 'V.X', 'km/s')
826 ... VY = (3, 'V.Y', 'km/s')
827 ...
828
829 >>> print(Coordinate['PY'])
830 Coordinate.PY
831
832 >>> print(Coordinate(3))
833 Coordinate.VY
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700834
835Interesting examples
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700836--------------------
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700837
Ethan Furman65a5a472016-09-01 23:55:19 -0700838While :class:`Enum`, :class:`IntEnum`, :class:`IntFlag`, and :class:`Flag` are
839expected to cover the majority of use-cases, they cannot cover them all. Here
840are recipes for some different types of enumerations that can be used directly,
841or as examples for creating one's own.
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700842
843
Ethan Furman6a137e82016-09-07 08:17:15 -0700844Omitting values
845^^^^^^^^^^^^^^^
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700846
Ethan Furman6a137e82016-09-07 08:17:15 -0700847In many use-cases one doesn't care what the actual value of an enumeration
848is. There are several ways to define this type of simple enumeration:
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700849
Ethan Furmanc16595e2016-09-10 23:36:59 -0700850- use instances of :class:`auto` for the value
Ethan Furman6a137e82016-09-07 08:17:15 -0700851- use instances of :class:`object` as the value
852- use a descriptive string as the value
853- use a tuple as the value and a custom :meth:`__new__` to replace the
854 tuple with an :class:`int` value
855
856Using any of these methods signifies to the user that these values are not
857important, and also enables one to add, remove, or reorder members without
858having to renumber the remaining members.
859
860Whichever method you choose, you should provide a :meth:`repr` that also hides
861the (unimportant) value::
862
863 >>> class NoValue(Enum):
864 ... def __repr__(self):
865 ... return '<%s.%s>' % (self.__class__.__name__, self.name)
866 ...
867
868
Ethan Furmanc16595e2016-09-10 23:36:59 -0700869Using :class:`auto`
870"""""""""""""""""""
871
Berker Peksag2a267a12017-01-02 05:51:04 +0300872Using :class:`auto` would look like::
Ethan Furmanc16595e2016-09-10 23:36:59 -0700873
874 >>> class Color(NoValue):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800875 ... RED = auto()
876 ... BLUE = auto()
877 ... GREEN = auto()
Ethan Furmanc16595e2016-09-10 23:36:59 -0700878 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800879 >>> Color.GREEN
880 <Color.GREEN>
Ethan Furmanc16595e2016-09-10 23:36:59 -0700881
882
Ethan Furman6a137e82016-09-07 08:17:15 -0700883Using :class:`object`
884"""""""""""""""""""""
885
886Using :class:`object` would look like::
887
888 >>> class Color(NoValue):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800889 ... RED = object()
890 ... GREEN = object()
891 ... BLUE = object()
Ethan Furman6a137e82016-09-07 08:17:15 -0700892 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800893 >>> Color.GREEN
894 <Color.GREEN>
Ethan Furman6a137e82016-09-07 08:17:15 -0700895
896
897Using a descriptive string
898""""""""""""""""""""""""""
899
900Using a string as the value would look like::
901
902 >>> class Color(NoValue):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800903 ... RED = 'stop'
904 ... GREEN = 'go'
905 ... BLUE = 'too fast!'
Ethan Furman6a137e82016-09-07 08:17:15 -0700906 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800907 >>> Color.GREEN
908 <Color.GREEN>
909 >>> Color.GREEN.value
Ethan Furman6a137e82016-09-07 08:17:15 -0700910 'go'
911
912
913Using a custom :meth:`__new__`
914""""""""""""""""""""""""""""""
915
916Using an auto-numbering :meth:`__new__` would look like::
917
918 >>> class AutoNumber(NoValue):
Ethan Furman332dbc72016-08-20 00:00:52 -0700919 ... def __new__(cls):
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700920 ... value = len(cls.__members__) + 1
921 ... obj = object.__new__(cls)
Ethan Furman90262622013-07-30 12:24:25 -0700922 ... obj._value_ = value
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700923 ... return obj
924 ...
Ethan Furman332dbc72016-08-20 00:00:52 -0700925 >>> class Color(AutoNumber):
Ethan Furman23bb6f42016-11-21 09:22:05 -0800926 ... RED = ()
927 ... GREEN = ()
928 ... BLUE = ()
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700929 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -0800930 >>> Color.GREEN
931 <Color.GREEN>
932 >>> Color.GREEN.value
Ethan Furman6a137e82016-09-07 08:17:15 -0700933 2
934
Ethan Furman62e40d82020-09-22 00:05:27 -0700935To make a more general purpose ``AutoNumber``, add ``*args`` to the signature::
936
937 >>> class AutoNumber(NoValue):
938 ... def __new__(cls, *args): # this is the only change from above
939 ... value = len(cls.__members__) + 1
940 ... obj = object.__new__(cls)
941 ... obj._value_ = value
942 ... return obj
943 ...
944
945Then when you inherit from ``AutoNumber`` you can write your own ``__init__``
946to handle any extra arguments::
947
948 >>> class Swatch(AutoNumber):
949 ... def __init__(self, pantone='unknown'):
950 ... self.pantone = pantone
951 ... AUBURN = '3497'
952 ... SEA_GREEN = '1246'
953 ... BLEACHED_CORAL = () # New color, no Pantone code yet!
954 ...
955 >>> Swatch.SEA_GREEN
956 <Swatch.SEA_GREEN: 2>
957 >>> Swatch.SEA_GREEN.pantone
958 '1246'
959 >>> Swatch.BLEACHED_CORAL.pantone
960 'unknown'
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700961
Ethan Furman9a1daf52013-09-27 22:58:06 -0700962.. note::
963
964 The :meth:`__new__` method, if defined, is used during creation of the Enum
965 members; it is then replaced by Enum's :meth:`__new__` which is used after
Ethan Furmanf75805e2014-09-16 19:13:31 -0700966 class creation for lookup of existing members.
Ethan Furman9a1daf52013-09-27 22:58:06 -0700967
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700968
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700969OrderedEnum
Ethan Furmaned0bf8a2013-09-06 19:53:30 -0700970^^^^^^^^^^^
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700971
972An ordered enumeration that is not based on :class:`IntEnum` and so maintains
973the normal :class:`Enum` invariants (such as not being comparable to other
974enumerations)::
975
976 >>> class OrderedEnum(Enum):
977 ... def __ge__(self, other):
978 ... if self.__class__ is other.__class__:
Ethan Furman90262622013-07-30 12:24:25 -0700979 ... return self.value >= other.value
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700980 ... return NotImplemented
981 ... def __gt__(self, other):
982 ... if self.__class__ is other.__class__:
Ethan Furman90262622013-07-30 12:24:25 -0700983 ... return self.value > other.value
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700984 ... return NotImplemented
985 ... def __le__(self, other):
986 ... if self.__class__ is other.__class__:
Ethan Furman90262622013-07-30 12:24:25 -0700987 ... return self.value <= other.value
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700988 ... return NotImplemented
989 ... def __lt__(self, other):
990 ... if self.__class__ is other.__class__:
Ethan Furman90262622013-07-30 12:24:25 -0700991 ... return self.value < other.value
Ethan Furman6b3d64a2013-06-14 16:55:46 -0700992 ... return NotImplemented
993 ...
994 >>> class Grade(OrderedEnum):
995 ... A = 5
996 ... B = 4
997 ... C = 3
998 ... D = 2
999 ... F = 1
1000 ...
1001 >>> Grade.C < Grade.A
1002 True
1003
1004
Ethan Furmanf24bb352013-07-18 17:05:39 -07001005DuplicateFreeEnum
Ethan Furmaned0bf8a2013-09-06 19:53:30 -07001006^^^^^^^^^^^^^^^^^
Ethan Furmanf24bb352013-07-18 17:05:39 -07001007
1008Raises an error if a duplicate member name is found instead of creating an
1009alias::
1010
1011 >>> class DuplicateFreeEnum(Enum):
1012 ... def __init__(self, *args):
1013 ... cls = self.__class__
1014 ... if any(self.value == e.value for e in cls):
1015 ... a = self.name
1016 ... e = cls(self.value).name
1017 ... raise ValueError(
1018 ... "aliases not allowed in DuplicateFreeEnum: %r --> %r"
1019 ... % (a, e))
1020 ...
1021 >>> class Color(DuplicateFreeEnum):
Ethan Furman23bb6f42016-11-21 09:22:05 -08001022 ... RED = 1
1023 ... GREEN = 2
1024 ... BLUE = 3
1025 ... GRENE = 2
Ethan Furmaned0bf8a2013-09-06 19:53:30 -07001026 ...
Ethan Furmanf24bb352013-07-18 17:05:39 -07001027 Traceback (most recent call last):
1028 ...
Ethan Furman23bb6f42016-11-21 09:22:05 -08001029 ValueError: aliases not allowed in DuplicateFreeEnum: 'GRENE' --> 'GREEN'
Ethan Furmanf24bb352013-07-18 17:05:39 -07001030
1031.. note::
1032
1033 This is a useful example for subclassing Enum to add or change other
Ezio Melotti93d7dda2013-10-05 04:13:18 +03001034 behaviors as well as disallowing aliases. If the only desired change is
Ezio Melotti17f1edd2013-10-05 04:26:06 +03001035 disallowing aliases, the :func:`unique` decorator can be used instead.
Ethan Furmanf24bb352013-07-18 17:05:39 -07001036
1037
Ethan Furman6b3d64a2013-06-14 16:55:46 -07001038Planet
Ethan Furmaned0bf8a2013-09-06 19:53:30 -07001039^^^^^^
Ethan Furman6b3d64a2013-06-14 16:55:46 -07001040
1041If :meth:`__new__` or :meth:`__init__` is defined the value of the enum member
1042will be passed to those methods::
1043
1044 >>> class Planet(Enum):
1045 ... MERCURY = (3.303e+23, 2.4397e6)
1046 ... VENUS = (4.869e+24, 6.0518e6)
1047 ... EARTH = (5.976e+24, 6.37814e6)
1048 ... MARS = (6.421e+23, 3.3972e6)
1049 ... JUPITER = (1.9e+27, 7.1492e7)
1050 ... SATURN = (5.688e+26, 6.0268e7)
1051 ... URANUS = (8.686e+25, 2.5559e7)
1052 ... NEPTUNE = (1.024e+26, 2.4746e7)
1053 ... def __init__(self, mass, radius):
1054 ... self.mass = mass # in kilograms
1055 ... self.radius = radius # in meters
1056 ... @property
1057 ... def surface_gravity(self):
1058 ... # universal gravitational constant (m3 kg-1 s-2)
1059 ... G = 6.67300E-11
1060 ... return G * self.mass / (self.radius * self.radius)
1061 ...
1062 >>> Planet.EARTH.value
1063 (5.976e+24, 6378140.0)
1064 >>> Planet.EARTH.surface_gravity
1065 9.802652743337129
Ethan Furman9a1daf52013-09-27 22:58:06 -07001066
1067
Ethan Furmana4b1bb42018-01-22 07:56:37 -08001068TimePeriod
1069^^^^^^^^^^
1070
1071An example to show the :attr:`_ignore_` attribute in use::
1072
1073 >>> from datetime import timedelta
1074 >>> class Period(timedelta, Enum):
1075 ... "different lengths of time"
1076 ... _ignore_ = 'Period i'
1077 ... Period = vars()
1078 ... for i in range(367):
1079 ... Period['day_%d' % i] = i
1080 ...
1081 >>> list(Period)[:2]
1082 [<Period.day_0: datetime.timedelta(0)>, <Period.day_1: datetime.timedelta(days=1)>]
1083 >>> list(Period)[-2:]
1084 [<Period.day_365: datetime.timedelta(days=365)>, <Period.day_366: datetime.timedelta(days=366)>]
1085
1086
Ethan Furman9a1daf52013-09-27 22:58:06 -07001087How are Enums different?
1088------------------------
1089
1090Enums have a custom metaclass that affects many aspects of both derived Enum
1091classes and their instances (members).
1092
1093
1094Enum Classes
1095^^^^^^^^^^^^
1096
1097The :class:`EnumMeta` metaclass is responsible for providing the
1098:meth:`__contains__`, :meth:`__dir__`, :meth:`__iter__` and other methods that
1099allow one to do things with an :class:`Enum` class that fail on a typical
Rahul Jha94306522018-09-10 23:51:04 +05301100class, such as `list(Color)` or `some_enum_var in Color`. :class:`EnumMeta` is
Ethan Furman9a1daf52013-09-27 22:58:06 -07001101responsible for ensuring that various other methods on the final :class:`Enum`
1102class are correct (such as :meth:`__new__`, :meth:`__getnewargs__`,
Martin Panterd21e0b52015-10-10 10:36:22 +00001103:meth:`__str__` and :meth:`__repr__`).
Ethan Furman9a1daf52013-09-27 22:58:06 -07001104
1105
1106Enum Members (aka instances)
1107^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1108
1109The most interesting thing about Enum members is that they are singletons.
1110:class:`EnumMeta` creates them all while it is creating the :class:`Enum`
1111class itself, and then puts a custom :meth:`__new__` in place to ensure
1112that no new ones are ever instantiated by returning only the existing
1113member instances.
1114
1115
1116Finer Points
1117^^^^^^^^^^^^
1118
Ethan Furman65a5a472016-09-01 23:55:19 -07001119Supported ``__dunder__`` names
Ethan Furman6a137e82016-09-07 08:17:15 -07001120""""""""""""""""""""""""""""""
Ethan Furman9a1daf52013-09-27 22:58:06 -07001121
INADA Naokie57f91a2018-06-19 01:14:26 +09001122:attr:`__members__` is a read-only ordered mapping of ``member_name``:``member``
Ethan Furman65a5a472016-09-01 23:55:19 -07001123items. It is only available on the class.
Ethan Furman9a1daf52013-09-27 22:58:06 -07001124
Ethan Furman65a5a472016-09-01 23:55:19 -07001125:meth:`__new__`, if specified, must create and return the enum members; it is
1126also a very good idea to set the member's :attr:`_value_` appropriately. Once
1127all the members are created it is no longer used.
Ethan Furman748dad52015-11-20 13:12:26 -08001128
Ethan Furman60255b62016-01-15 15:01:33 -08001129
Ethan Furman65a5a472016-09-01 23:55:19 -07001130Supported ``_sunder_`` names
Ethan Furman6a137e82016-09-07 08:17:15 -07001131""""""""""""""""""""""""""""
Ethan Furman60255b62016-01-15 15:01:33 -08001132
Ethan Furman65a5a472016-09-01 23:55:19 -07001133- ``_name_`` -- name of the member
1134- ``_value_`` -- value of the member; can be set / modified in ``__new__``
Ethan Furman9a1daf52013-09-27 22:58:06 -07001135
Ethan Furman65a5a472016-09-01 23:55:19 -07001136- ``_missing_`` -- a lookup function used when a value is not found; may be
1137 overridden
Antoined3c8d732019-08-20 03:41:31 +02001138- ``_ignore_`` -- a list of names, either as a :class:`list` or a :class:`str`,
Ethan Furmana4b1bb42018-01-22 07:56:37 -08001139 that will not be transformed into members, and will be removed from the final
1140 class
Ethan Furman65a5a472016-09-01 23:55:19 -07001141- ``_order_`` -- used in Python 2/3 code to ensure member order is consistent
1142 (class attribute, removed during class creation)
Ethan Furmanc16595e2016-09-10 23:36:59 -07001143- ``_generate_next_value_`` -- used by the `Functional API`_ and by
1144 :class:`auto` to get an appropriate value for an enum member; may be
1145 overridden
Ethan Furman9a1daf52013-09-27 22:58:06 -07001146
Ethan Furmanc16595e2016-09-10 23:36:59 -07001147.. versionadded:: 3.6 ``_missing_``, ``_order_``, ``_generate_next_value_``
Ethan Furmana4b1bb42018-01-22 07:56:37 -08001148.. versionadded:: 3.7 ``_ignore_``
Ethan Furman332dbc72016-08-20 00:00:52 -07001149
Ethan Furman65a5a472016-09-01 23:55:19 -07001150To help keep Python 2 / Python 3 code in sync an :attr:`_order_` attribute can
1151be provided. It will be checked against the actual order of the enumeration
1152and raise an error if the two do not match::
Ethan Furmane8e61272016-08-20 07:19:31 -07001153
1154 >>> class Color(Enum):
Ethan Furman23bb6f42016-11-21 09:22:05 -08001155 ... _order_ = 'RED GREEN BLUE'
1156 ... RED = 1
1157 ... BLUE = 3
1158 ... GREEN = 2
Ethan Furmane8e61272016-08-20 07:19:31 -07001159 ...
1160 Traceback (most recent call last):
1161 ...
1162 TypeError: member order does not match _order_
1163
1164.. note::
1165
1166 In Python 2 code the :attr:`_order_` attribute is necessary as definition
Ethan Furman65a5a472016-09-01 23:55:19 -07001167 order is lost before it can be recorded.
1168
Ethan Furman7cf0aad2020-12-09 17:12:11 -08001169
1170_Private__names
1171"""""""""""""""
1172
1173Private names are not converted to Enum members, but remain normal attributes.
1174
1175.. versionchanged:: 3.10
1176
1177
Ethan Furman65a5a472016-09-01 23:55:19 -07001178``Enum`` member type
Ethan Furman6a137e82016-09-07 08:17:15 -07001179""""""""""""""""""""
Ethan Furman65a5a472016-09-01 23:55:19 -07001180
Ethan Furman54924df2016-09-07 23:40:31 -07001181:class:`Enum` members are instances of their :class:`Enum` class, and are
1182normally accessed as ``EnumClass.member``. Under certain circumstances they
1183can also be accessed as ``EnumClass.member.member``, but you should never do
1184this as that lookup may fail or, worse, return something besides the
Ethan Furman23bb6f42016-11-21 09:22:05 -08001185:class:`Enum` member you are looking for (this is another good reason to use
1186all-uppercase names for members)::
Ethan Furman65a5a472016-09-01 23:55:19 -07001187
1188 >>> class FieldTypes(Enum):
1189 ... name = 0
1190 ... value = 1
1191 ... size = 2
1192 ...
1193 >>> FieldTypes.value.size
1194 <FieldTypes.size: 2>
1195 >>> FieldTypes.size.value
1196 2
1197
1198.. versionchanged:: 3.5
1199
1200
Ethan Furman0063ff42020-09-21 17:23:13 -07001201Creating members that are mixed with other data types
1202"""""""""""""""""""""""""""""""""""""""""""""""""""""
1203
1204When subclassing other data types, such as :class:`int` or :class:`str`, with
1205an :class:`Enum`, all values after the `=` are passed to that data type's
1206constructor. For example::
1207
1208 >>> class MyEnum(IntEnum):
1209 ... example = '11', 16 # '11' will be interpreted as a hexadecimal
1210 ... # number
1211 >>> MyEnum.example
1212 <MyEnum.example: 17>
1213
1214
Ethan Furman65a5a472016-09-01 23:55:19 -07001215Boolean value of ``Enum`` classes and members
Ethan Furman6a137e82016-09-07 08:17:15 -07001216"""""""""""""""""""""""""""""""""""""""""""""
Ethan Furman65a5a472016-09-01 23:55:19 -07001217
Ethan Furman54924df2016-09-07 23:40:31 -07001218:class:`Enum` members that are mixed with non-:class:`Enum` types (such as
Ethan Furman65a5a472016-09-01 23:55:19 -07001219:class:`int`, :class:`str`, etc.) are evaluated according to the mixed-in
Ethan Furman54924df2016-09-07 23:40:31 -07001220type's rules; otherwise, all members evaluate as :data:`True`. To make your
1221own Enum's boolean evaluation depend on the member's value add the following to
Ethan Furman65a5a472016-09-01 23:55:19 -07001222your class::
1223
1224 def __bool__(self):
1225 return bool(self.value)
1226
Ethan Furman54924df2016-09-07 23:40:31 -07001227:class:`Enum` classes always evaluate as :data:`True`.
Ethan Furman65a5a472016-09-01 23:55:19 -07001228
1229
1230``Enum`` classes with methods
Ethan Furman6a137e82016-09-07 08:17:15 -07001231"""""""""""""""""""""""""""""
Ethan Furman65a5a472016-09-01 23:55:19 -07001232
1233If you give your :class:`Enum` subclass extra methods, like the `Planet`_
1234class above, those methods will show up in a :func:`dir` of the member,
1235but not of the class::
1236
1237 >>> dir(Planet)
1238 ['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__']
1239 >>> dir(Planet.EARTH)
1240 ['__class__', '__doc__', '__module__', 'name', 'surface_gravity', 'value']
1241
Ethan Furman3515dcc2016-09-18 13:15:41 -07001242
1243Combining members of ``Flag``
1244"""""""""""""""""""""""""""""
1245
1246If a combination of Flag members is not named, the :func:`repr` will include
1247all named flags and all named combinations of flags that are in the value::
1248
1249 >>> class Color(Flag):
Ethan Furman23bb6f42016-11-21 09:22:05 -08001250 ... RED = auto()
1251 ... GREEN = auto()
1252 ... BLUE = auto()
1253 ... MAGENTA = RED | BLUE
1254 ... YELLOW = RED | GREEN
1255 ... CYAN = GREEN | BLUE
Ethan Furman3515dcc2016-09-18 13:15:41 -07001256 ...
1257 >>> Color(3) # named combination
Ethan Furman23bb6f42016-11-21 09:22:05 -08001258 <Color.YELLOW: 3>
Ethan Furman3515dcc2016-09-18 13:15:41 -07001259 >>> Color(7) # not named combination
Ethan Furman23bb6f42016-11-21 09:22:05 -08001260 <Color.CYAN|MAGENTA|BLUE|YELLOW|GREEN|RED: 7>
Ethan Furman3515dcc2016-09-18 13:15:41 -07001261
Ethan Furmand986d162020-09-22 13:00:07 -07001262``StrEnum`` and :meth:`str.__str__`
1263"""""""""""""""""""""""""""""""""""
1264
1265An important difference between :class:`StrEnum` and other Enums is the
1266:meth:`__str__` method; because :class:`StrEnum` members are strings, some
1267parts of Python will read the string data directly, while others will call
1268:meth:`str()`. To make those two operations have the same result,
1269:meth:`StrEnum.__str__` will be the same as :meth:`str.__str__` so that
1270``str(StrEnum.member) == StrEnum.member`` is true.
1271