• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1.. _enum-howto:
2
3==========
4Enum HOWTO
5==========
6
7.. _enum-basic-tutorial:
8
9.. currentmodule:: enum
10
11An :class:`Enum` is a set of symbolic names bound to unique values.  They are
12similar to global variables, but they offer a more useful :func:`repr`,
13grouping, type-safety, and a few other features.
14
15They are most useful when you have a variable that can take one of a limited
16selection of values.  For example, the days of the week::
17
18    >>> from enum import Enum
19    >>> class Weekday(Enum):
20    ...     MONDAY = 1
21    ...     TUESDAY = 2
22    ...     WEDNESDAY = 3
23    ...     THURSDAY = 4
24    ...     FRIDAY = 5
25    ...     SATURDAY = 6
26    ...     SUNDAY = 7
27
28Or perhaps the RGB primary colors::
29
30    >>> from enum import Enum
31    >>> class Color(Enum):
32    ...     RED = 1
33    ...     GREEN = 2
34    ...     BLUE = 3
35
36As you can see, creating an :class:`Enum` is as simple as writing a class that
37inherits from :class:`Enum` itself.
38
39.. note:: Case of Enum Members
40
41    Because Enums are used to represent constants, and to help avoid issues
42    with name clashes between mixin-class methods/attributes and enum names,
43    we strongly recommend using UPPER_CASE names for members, and will be using
44    that style in our examples.
45
46Depending on the nature of the enum a member's value may or may not be
47important, but either way that value can be used to get the corresponding
48member::
49
50    >>> Weekday(3)
51    <Weekday.WEDNESDAY: 3>
52
53As you can see, the ``repr()`` of a member shows the enum name, the member name,
54and the value.  The ``str()`` of a member shows only the enum name and member
55name::
56
57    >>> print(Weekday.THURSDAY)
58    Weekday.THURSDAY
59
60The *type* of an enumeration member is the enum it belongs to::
61
62    >>> type(Weekday.MONDAY)
63    <enum 'Weekday'>
64    >>> isinstance(Weekday.FRIDAY, Weekday)
65    True
66
67Enum members have an attribute that contains just their :attr:`!name`::
68
69    >>> print(Weekday.TUESDAY.name)
70    TUESDAY
71
72Likewise, they have an attribute for their :attr:`!value`::
73
74
75    >>> Weekday.WEDNESDAY.value
76    3
77
78Unlike many languages that treat enumerations solely as name/value pairs,
79Python Enums can have behavior added.  For example, :class:`datetime.date`
80has two methods for returning the weekday:
81:meth:`~datetime.date.weekday` and :meth:`~datetime.date.isoweekday`.
82The difference is that one of them counts from 0-6 and the other from 1-7.
83Rather than keep track of that ourselves we can add a method to the :class:`!Weekday`
84enum to extract the day from the :class:`~datetime.date` instance and return the matching
85enum member::
86
87        @classmethod
88        def from_date(cls, date):
89            return cls(date.isoweekday())
90
91The complete :class:`!Weekday` enum now looks like this::
92
93    >>> class Weekday(Enum):
94    ...     MONDAY = 1
95    ...     TUESDAY = 2
96    ...     WEDNESDAY = 3
97    ...     THURSDAY = 4
98    ...     FRIDAY = 5
99    ...     SATURDAY = 6
100    ...     SUNDAY = 7
101    ...     #
102    ...     @classmethod
103    ...     def from_date(cls, date):
104    ...         return cls(date.isoweekday())
105
106Now we can find out what today is!  Observe::
107
108    >>> from datetime import date
109    >>> Weekday.from_date(date.today())     # doctest: +SKIP
110    <Weekday.TUESDAY: 2>
111
112Of course, if you're reading this on some other day, you'll see that day instead.
113
114This :class:`!Weekday` enum is great if our variable only needs one day, but
115what if we need several?  Maybe we're writing a function to plot chores during
116a week, and don't want to use a :class:`list` -- we could use a different type
117of :class:`Enum`::
118
119    >>> from enum import Flag
120    >>> class Weekday(Flag):
121    ...     MONDAY = 1
122    ...     TUESDAY = 2
123    ...     WEDNESDAY = 4
124    ...     THURSDAY = 8
125    ...     FRIDAY = 16
126    ...     SATURDAY = 32
127    ...     SUNDAY = 64
128
129We've changed two things: we're inherited from :class:`Flag`, and the values are
130all powers of 2.
131
132Just like the original :class:`!Weekday` enum above, we can have a single selection::
133
134    >>> first_week_day = Weekday.MONDAY
135    >>> first_week_day
136    <Weekday.MONDAY: 1>
137
138But :class:`Flag` also allows us to combine several members into a single
139variable::
140
141    >>> weekend = Weekday.SATURDAY | Weekday.SUNDAY
142    >>> weekend
143    <Weekday.SATURDAY|SUNDAY: 96>
144
145You can even iterate over a :class:`Flag` variable::
146
147    >>> for day in weekend:
148    ...     print(day)
149    Weekday.SATURDAY
150    Weekday.SUNDAY
151
152Okay, let's get some chores set up::
153
154    >>> chores_for_ethan = {
155    ...     'feed the cat': Weekday.MONDAY | Weekday.WEDNESDAY | Weekday.FRIDAY,
156    ...     'do the dishes': Weekday.TUESDAY | Weekday.THURSDAY,
157    ...     'answer SO questions': Weekday.SATURDAY,
158    ...     }
159
160And a function to display the chores for a given day::
161
162    >>> def show_chores(chores, day):
163    ...     for chore, days in chores.items():
164    ...         if day in days:
165    ...             print(chore)
166    ...
167    >>> show_chores(chores_for_ethan, Weekday.SATURDAY)
168    answer SO questions
169
170In cases where the actual values of the members do not matter, you can save
171yourself some work and use :func:`auto` for the values::
172
173    >>> from enum import auto
174    >>> class Weekday(Flag):
175    ...     MONDAY = auto()
176    ...     TUESDAY = auto()
177    ...     WEDNESDAY = auto()
178    ...     THURSDAY = auto()
179    ...     FRIDAY = auto()
180    ...     SATURDAY = auto()
181    ...     SUNDAY = auto()
182    ...     WEEKEND = SATURDAY | SUNDAY
183
184
185.. _enum-advanced-tutorial:
186
187
188Programmatic access to enumeration members and their attributes
189---------------------------------------------------------------
190
191Sometimes it's useful to access members in enumerations programmatically (i.e.
192situations where ``Color.RED`` won't do because the exact color is not known
193at program-writing time).  ``Enum`` allows such access::
194
195    >>> Color(1)
196    <Color.RED: 1>
197    >>> Color(3)
198    <Color.BLUE: 3>
199
200If you want to access enum members by *name*, use item access::
201
202    >>> Color['RED']
203    <Color.RED: 1>
204    >>> Color['GREEN']
205    <Color.GREEN: 2>
206
207If you have an enum member and need its :attr:`!name` or :attr:`!value`::
208
209    >>> member = Color.RED
210    >>> member.name
211    'RED'
212    >>> member.value
213    1
214
215
216Duplicating enum members and values
217-----------------------------------
218
219Having two enum members with the same name is invalid::
220
221    >>> class Shape(Enum):
222    ...     SQUARE = 2
223    ...     SQUARE = 3
224    ...
225    Traceback (most recent call last):
226    ...
227    TypeError: 'SQUARE' already defined as 2
228
229However, an enum member can have other names associated with it.  Given two
230entries ``A`` and ``B`` with the same value (and ``A`` defined first), ``B``
231is an alias for the member ``A``.  By-value lookup of the value of ``A`` will
232return the member ``A``.  By-name lookup of ``A`` will return the member ``A``.
233By-name lookup of ``B`` will also return the member ``A``::
234
235    >>> class Shape(Enum):
236    ...     SQUARE = 2
237    ...     DIAMOND = 1
238    ...     CIRCLE = 3
239    ...     ALIAS_FOR_SQUARE = 2
240    ...
241    >>> Shape.SQUARE
242    <Shape.SQUARE: 2>
243    >>> Shape.ALIAS_FOR_SQUARE
244    <Shape.SQUARE: 2>
245    >>> Shape(2)
246    <Shape.SQUARE: 2>
247
248.. note::
249
250    Attempting to create a member with the same name as an already
251    defined attribute (another member, a method, etc.) or attempting to create
252    an attribute with the same name as a member is not allowed.
253
254
255Ensuring unique enumeration values
256----------------------------------
257
258By default, enumerations allow multiple names as aliases for the same value.
259When this behavior isn't desired, you can use the :func:`unique` decorator::
260
261    >>> from enum import Enum, unique
262    >>> @unique
263    ... class Mistake(Enum):
264    ...     ONE = 1
265    ...     TWO = 2
266    ...     THREE = 3
267    ...     FOUR = 3
268    ...
269    Traceback (most recent call last):
270    ...
271    ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
272
273
274Using automatic values
275----------------------
276
277If the exact value is unimportant you can use :class:`auto`::
278
279    >>> from enum import Enum, auto
280    >>> class Color(Enum):
281    ...     RED = auto()
282    ...     BLUE = auto()
283    ...     GREEN = auto()
284    ...
285    >>> [member.value for member in Color]
286    [1, 2, 3]
287
288The values are chosen by :func:`~Enum._generate_next_value_`, which can be
289overridden::
290
291    >>> class AutoName(Enum):
292    ...     @staticmethod
293    ...     def _generate_next_value_(name, start, count, last_values):
294    ...         return name
295    ...
296    >>> class Ordinal(AutoName):
297    ...     NORTH = auto()
298    ...     SOUTH = auto()
299    ...     EAST = auto()
300    ...     WEST = auto()
301    ...
302    >>> [member.value for member in Ordinal]
303    ['NORTH', 'SOUTH', 'EAST', 'WEST']
304
305.. note::
306
307    The :meth:`~Enum._generate_next_value_` method must be defined before any members.
308
309Iteration
310---------
311
312Iterating over the members of an enum does not provide the aliases::
313
314    >>> list(Shape)
315    [<Shape.SQUARE: 2>, <Shape.DIAMOND: 1>, <Shape.CIRCLE: 3>]
316    >>> list(Weekday)
317    [<Weekday.MONDAY: 1>, <Weekday.TUESDAY: 2>, <Weekday.WEDNESDAY: 4>, <Weekday.THURSDAY: 8>, <Weekday.FRIDAY: 16>, <Weekday.SATURDAY: 32>, <Weekday.SUNDAY: 64>]
318
319Note that the aliases ``Shape.ALIAS_FOR_SQUARE`` and ``Weekday.WEEKEND`` aren't shown.
320
321The special attribute ``__members__`` is a read-only ordered mapping of names
322to members.  It includes all names defined in the enumeration, including the
323aliases::
324
325    >>> for name, member in Shape.__members__.items():
326    ...     name, member
327    ...
328    ('SQUARE', <Shape.SQUARE: 2>)
329    ('DIAMOND', <Shape.DIAMOND: 1>)
330    ('CIRCLE', <Shape.CIRCLE: 3>)
331    ('ALIAS_FOR_SQUARE', <Shape.SQUARE: 2>)
332
333The ``__members__`` attribute can be used for detailed programmatic access to
334the enumeration members.  For example, finding all the aliases::
335
336    >>> [name for name, member in Shape.__members__.items() if member.name != name]
337    ['ALIAS_FOR_SQUARE']
338
339.. note::
340
341   Aliases for flags include values with multiple flags set, such as ``3``,
342   and no flags set, i.e. ``0``.
343
344
345Comparisons
346-----------
347
348Enumeration members are compared by identity::
349
350    >>> Color.RED is Color.RED
351    True
352    >>> Color.RED is Color.BLUE
353    False
354    >>> Color.RED is not Color.BLUE
355    True
356
357Ordered comparisons between enumeration values are *not* supported.  Enum
358members are not integers (but see `IntEnum`_ below)::
359
360    >>> Color.RED < Color.BLUE
361    Traceback (most recent call last):
362      File "<stdin>", line 1, in <module>
363    TypeError: '<' not supported between instances of 'Color' and 'Color'
364
365Equality comparisons are defined though::
366
367    >>> Color.BLUE == Color.RED
368    False
369    >>> Color.BLUE != Color.RED
370    True
371    >>> Color.BLUE == Color.BLUE
372    True
373
374Comparisons against non-enumeration values will always compare not equal
375(again, :class:`IntEnum` was explicitly designed to behave differently, see
376below)::
377
378    >>> Color.BLUE == 2
379    False
380
381.. warning::
382
383   It is possible to reload modules -- if a reloaded module contains
384   enums, they will be recreated, and the new members may not
385   compare identical/equal to the original members.
386
387Allowed members and attributes of enumerations
388----------------------------------------------
389
390Most of the examples above use integers for enumeration values.  Using integers
391is short and handy (and provided by default by the `Functional API`_), but not
392strictly enforced.  In the vast majority of use-cases, one doesn't care what
393the actual value of an enumeration is.  But if the value *is* important,
394enumerations can have arbitrary values.
395
396Enumerations are Python classes, and can have methods and special methods as
397usual.  If we have this enumeration::
398
399    >>> class Mood(Enum):
400    ...     FUNKY = 1
401    ...     HAPPY = 3
402    ...
403    ...     def describe(self):
404    ...         # self is the member here
405    ...         return self.name, self.value
406    ...
407    ...     def __str__(self):
408    ...         return 'my custom str! {0}'.format(self.value)
409    ...
410    ...     @classmethod
411    ...     def favorite_mood(cls):
412    ...         # cls here is the enumeration
413    ...         return cls.HAPPY
414    ...
415
416Then::
417
418    >>> Mood.favorite_mood()
419    <Mood.HAPPY: 3>
420    >>> Mood.HAPPY.describe()
421    ('HAPPY', 3)
422    >>> str(Mood.FUNKY)
423    'my custom str! 1'
424
425The rules for what is allowed are as follows: names that start and end with
426a single underscore are reserved by enum and cannot be used; all other
427attributes defined within an enumeration will become members of this
428enumeration, with the exception of special methods (:meth:`~object.__str__`,
429:meth:`~object.__add__`, etc.), descriptors (methods are also descriptors), and
430variable names listed in :attr:`~Enum._ignore_`.
431
432Note:  if your enumeration defines :meth:`~object.__new__` and/or :meth:`~object.__init__`,
433any value(s) given to the enum member will be passed into those methods.
434See `Planet`_ for an example.
435
436.. note::
437
438    The :meth:`~object.__new__` method, if defined, is used during creation of the Enum
439    members; it is then replaced by Enum's :meth:`~object.__new__` which is used after
440    class creation for lookup of existing members.  See :ref:`new-vs-init` for
441    more details.
442
443
444Restricted Enum subclassing
445---------------------------
446
447A new :class:`Enum` class must have one base enum class, up to one concrete
448data type, and as many :class:`object`-based mixin classes as needed.  The
449order of these base classes is::
450
451    class EnumName([mix-in, ...,] [data-type,] base-enum):
452        pass
453
454Also, subclassing an enumeration is allowed only if the enumeration does not define
455any members.  So this is forbidden::
456
457    >>> class MoreColor(Color):
458    ...     PINK = 17
459    ...
460    Traceback (most recent call last):
461    ...
462    TypeError: <enum 'MoreColor'> cannot extend <enum 'Color'>
463
464But this is allowed::
465
466    >>> class Foo(Enum):
467    ...     def some_behavior(self):
468    ...         pass
469    ...
470    >>> class Bar(Foo):
471    ...     HAPPY = 1
472    ...     SAD = 2
473    ...
474
475Allowing subclassing of enums that define members would lead to a violation of
476some important invariants of types and instances.  On the other hand, it makes
477sense to allow sharing some common behavior between a group of enumerations.
478(See `OrderedEnum`_ for an example.)
479
480
481.. _enum-dataclass-support:
482
483Dataclass support
484-----------------
485
486When inheriting from a :class:`~dataclasses.dataclass`,
487the :meth:`~Enum.__repr__` omits the inherited class' name.  For example::
488
489    >>> from dataclasses import dataclass, field
490    >>> @dataclass
491    ... class CreatureDataMixin:
492    ...     size: str
493    ...     legs: int
494    ...     tail: bool = field(repr=False, default=True)
495    ...
496    >>> class Creature(CreatureDataMixin, Enum):
497    ...     BEETLE = 'small', 6
498    ...     DOG = 'medium', 4
499    ...
500    >>> Creature.DOG
501    <Creature.DOG: size='medium', legs=4>
502
503Use the :func:`~dataclasses.dataclass` argument ``repr=False``
504to use the standard :func:`repr`.
505
506.. versionchanged:: 3.12
507   Only the dataclass fields are shown in the value area, not the dataclass'
508   name.
509
510.. note::
511
512   Adding :func:`~dataclasses.dataclass` decorator to :class:`Enum`
513   and its subclasses is not supported. It will not raise any errors,
514   but it will produce very strange results at runtime, such as members
515   being equal to each other::
516
517      >>> @dataclass               # don't do this: it does not make any sense
518      ... class Color(Enum):
519      ...    RED = 1
520      ...    BLUE = 2
521      ...
522      >>> Color.RED is Color.BLUE
523      False
524      >>> Color.RED == Color.BLUE  # problem is here: they should not be equal
525      True
526
527
528Pickling
529--------
530
531Enumerations can be pickled and unpickled::
532
533    >>> from test.test_enum import Fruit
534    >>> from pickle import dumps, loads
535    >>> Fruit.TOMATO is loads(dumps(Fruit.TOMATO))
536    True
537
538The usual restrictions for pickling apply: picklable enums must be defined in
539the top level of a module, since unpickling requires them to be importable
540from that module.
541
542.. note::
543
544    With pickle protocol version 4 it is possible to easily pickle enums
545    nested in other classes.
546
547It is possible to modify how enum members are pickled/unpickled by defining
548:meth:`~object.__reduce_ex__` in the enumeration class.  The default method is by-value,
549but enums with complicated values may want to use by-name::
550
551    >>> import enum
552    >>> class MyEnum(enum.Enum):
553    ...     __reduce_ex__ = enum.pickle_by_enum_name
554
555.. note::
556
557    Using by-name for flags is not recommended, as unnamed aliases will
558    not unpickle.
559
560
561Functional API
562--------------
563
564The :class:`Enum` class is callable, providing the following functional API::
565
566    >>> Animal = Enum('Animal', 'ANT BEE CAT DOG')
567    >>> Animal
568    <enum 'Animal'>
569    >>> Animal.ANT
570    <Animal.ANT: 1>
571    >>> list(Animal)
572    [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
573
574The semantics of this API resemble :class:`~collections.namedtuple`. The first
575argument of the call to :class:`Enum` is the name of the enumeration.
576
577The second argument is the *source* of enumeration member names.  It can be a
578whitespace-separated string of names, a sequence of names, a sequence of
5792-tuples with key/value pairs, or a mapping (e.g. dictionary) of names to
580values.  The last two options enable assigning arbitrary values to
581enumerations; the others auto-assign increasing integers starting with 1 (use
582the ``start`` parameter to specify a different starting value).  A
583new class derived from :class:`Enum` is returned.  In other words, the above
584assignment to :class:`!Animal` is equivalent to::
585
586    >>> class Animal(Enum):
587    ...     ANT = 1
588    ...     BEE = 2
589    ...     CAT = 3
590    ...     DOG = 4
591    ...
592
593The reason for defaulting to ``1`` as the starting number and not ``0`` is
594that ``0`` is ``False`` in a boolean sense, but by default enum members all
595evaluate to ``True``.
596
597Pickling enums created with the functional API can be tricky as frame stack
598implementation details are used to try and figure out which module the
599enumeration is being created in (e.g. it will fail if you use a utility
600function in a separate module, and also may not work on IronPython or Jython).
601The solution is to specify the module name explicitly as follows::
602
603    >>> Animal = Enum('Animal', 'ANT BEE CAT DOG', module=__name__)
604
605.. warning::
606
607    If ``module`` is not supplied, and Enum cannot determine what it is,
608    the new Enum members will not be unpicklable; to keep errors closer to
609    the source, pickling will be disabled.
610
611The new pickle protocol 4 also, in some circumstances, relies on
612:attr:`~type.__qualname__` being set to the location where pickle will be able
613to find the class.  For example, if the class was made available in class
614SomeData in the global scope::
615
616    >>> Animal = Enum('Animal', 'ANT BEE CAT DOG', qualname='SomeData.Animal')
617
618The complete signature is::
619
620    Enum(
621        value='NewEnumName',
622        names=<...>,
623        *,
624        module='...',
625        qualname='...',
626        type=<mixed-in class>,
627        start=1,
628        )
629
630* *value*: What the new enum class will record as its name.
631
632* *names*: The enum members.  This can be a whitespace- or comma-separated string
633  (values will start at 1 unless otherwise specified)::
634
635    'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE'
636
637  or an iterator of names::
638
639    ['RED', 'GREEN', 'BLUE']
640
641  or an iterator of (name, value) pairs::
642
643    [('CYAN', 4), ('MAGENTA', 5), ('YELLOW', 6)]
644
645  or a mapping::
646
647    {'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42}
648
649* *module*: name of module where new enum class can be found.
650
651* *qualname*: where in module new enum class can be found.
652
653* *type*: type to mix in to new enum class.
654
655* *start*: number to start counting at if only names are passed in.
656
657.. versionchanged:: 3.5
658   The *start* parameter was added.
659
660
661Derived Enumerations
662--------------------
663
664IntEnum
665^^^^^^^
666
667The first variation of :class:`Enum` that is provided is also a subclass of
668:class:`int`.  Members of an :class:`IntEnum` can be compared to integers;
669by extension, integer enumerations of different types can also be compared
670to each other::
671
672    >>> from enum import IntEnum
673    >>> class Shape(IntEnum):
674    ...     CIRCLE = 1
675    ...     SQUARE = 2
676    ...
677    >>> class Request(IntEnum):
678    ...     POST = 1
679    ...     GET = 2
680    ...
681    >>> Shape == 1
682    False
683    >>> Shape.CIRCLE == 1
684    True
685    >>> Shape.CIRCLE == Request.POST
686    True
687
688However, they still can't be compared to standard :class:`Enum` enumerations::
689
690    >>> class Shape(IntEnum):
691    ...     CIRCLE = 1
692    ...     SQUARE = 2
693    ...
694    >>> class Color(Enum):
695    ...     RED = 1
696    ...     GREEN = 2
697    ...
698    >>> Shape.CIRCLE == Color.RED
699    False
700
701:class:`IntEnum` values behave like integers in other ways you'd expect::
702
703    >>> int(Shape.CIRCLE)
704    1
705    >>> ['a', 'b', 'c'][Shape.CIRCLE]
706    'b'
707    >>> [i for i in range(Shape.SQUARE)]
708    [0, 1]
709
710
711StrEnum
712^^^^^^^
713
714The second variation of :class:`Enum` that is provided is also a subclass of
715:class:`str`.  Members of a :class:`StrEnum` can be compared to strings;
716by extension, string enumerations of different types can also be compared
717to each other.
718
719.. versionadded:: 3.11
720
721
722IntFlag
723^^^^^^^
724
725The next variation of :class:`Enum` provided, :class:`IntFlag`, is also based
726on :class:`int`.  The difference being :class:`IntFlag` members can be combined
727using the bitwise operators (&, \|, ^, ~) and the result is still an
728:class:`IntFlag` member, if possible.  Like :class:`IntEnum`, :class:`IntFlag`
729members are also integers and can be used wherever an :class:`int` is used.
730
731.. note::
732
733    Any operation on an :class:`IntFlag` member besides the bit-wise operations will
734    lose the :class:`IntFlag` membership.
735
736    Bit-wise operations that result in invalid :class:`IntFlag` values will lose the
737    :class:`IntFlag` membership.  See :class:`FlagBoundary` for
738    details.
739
740.. versionadded:: 3.6
741.. versionchanged:: 3.11
742
743Sample :class:`IntFlag` class::
744
745    >>> from enum import IntFlag
746    >>> class Perm(IntFlag):
747    ...     R = 4
748    ...     W = 2
749    ...     X = 1
750    ...
751    >>> Perm.R | Perm.W
752    <Perm.R|W: 6>
753    >>> Perm.R + Perm.W
754    6
755    >>> RW = Perm.R | Perm.W
756    >>> Perm.R in RW
757    True
758
759It is also possible to name the combinations::
760
761    >>> class Perm(IntFlag):
762    ...     R = 4
763    ...     W = 2
764    ...     X = 1
765    ...     RWX = 7
766    ...
767    >>> Perm.RWX
768    <Perm.RWX: 7>
769    >>> ~Perm.RWX
770    <Perm: 0>
771    >>> Perm(7)
772    <Perm.RWX: 7>
773
774.. note::
775
776    Named combinations are considered aliases.  Aliases do not show up during
777    iteration, but can be returned from by-value lookups.
778
779.. versionchanged:: 3.11
780
781Another important difference between :class:`IntFlag` and :class:`Enum` is that
782if no flags are set (the value is 0), its boolean evaluation is :data:`False`::
783
784    >>> Perm.R & Perm.X
785    <Perm: 0>
786    >>> bool(Perm.R & Perm.X)
787    False
788
789Because :class:`IntFlag` members are also subclasses of :class:`int` they can
790be combined with them (but may lose :class:`IntFlag` membership::
791
792    >>> Perm.X | 4
793    <Perm.R|X: 5>
794
795    >>> Perm.X + 8
796    9
797
798.. note::
799
800    The negation operator, ``~``, always returns an :class:`IntFlag` member with a
801    positive value::
802
803        >>> (~Perm.X).value == (Perm.R|Perm.W).value == 6
804        True
805
806:class:`IntFlag` members can also be iterated over::
807
808    >>> list(RW)
809    [<Perm.R: 4>, <Perm.W: 2>]
810
811.. versionadded:: 3.11
812
813
814Flag
815^^^^
816
817The last variation is :class:`Flag`.  Like :class:`IntFlag`, :class:`Flag`
818members can be combined using the bitwise operators (&, \|, ^, ~).  Unlike
819:class:`IntFlag`, they cannot be combined with, nor compared against, any
820other :class:`Flag` enumeration, nor :class:`int`.  While it is possible to
821specify the values directly it is recommended to use :class:`auto` as the
822value and let :class:`Flag` select an appropriate value.
823
824.. versionadded:: 3.6
825
826Like :class:`IntFlag`, if a combination of :class:`Flag` members results in no
827flags being set, the boolean evaluation is :data:`False`::
828
829    >>> from enum import Flag, auto
830    >>> class Color(Flag):
831    ...     RED = auto()
832    ...     BLUE = auto()
833    ...     GREEN = auto()
834    ...
835    >>> Color.RED & Color.GREEN
836    <Color: 0>
837    >>> bool(Color.RED & Color.GREEN)
838    False
839
840Individual flags should have values that are powers of two (1, 2, 4, 8, ...),
841while combinations of flags will not::
842
843    >>> class Color(Flag):
844    ...     RED = auto()
845    ...     BLUE = auto()
846    ...     GREEN = auto()
847    ...     WHITE = RED | BLUE | GREEN
848    ...
849    >>> Color.WHITE
850    <Color.WHITE: 7>
851
852Giving a name to the "no flags set" condition does not change its boolean
853value::
854
855    >>> class Color(Flag):
856    ...     BLACK = 0
857    ...     RED = auto()
858    ...     BLUE = auto()
859    ...     GREEN = auto()
860    ...
861    >>> Color.BLACK
862    <Color.BLACK: 0>
863    >>> bool(Color.BLACK)
864    False
865
866:class:`Flag` members can also be iterated over::
867
868    >>> purple = Color.RED | Color.BLUE
869    >>> list(purple)
870    [<Color.RED: 1>, <Color.BLUE: 2>]
871
872.. versionadded:: 3.11
873
874.. note::
875
876    For the majority of new code, :class:`Enum` and :class:`Flag` are strongly
877    recommended, since :class:`IntEnum` and :class:`IntFlag` break some
878    semantic promises of an enumeration (by being comparable to integers, and
879    thus by transitivity to other unrelated enumerations).  :class:`IntEnum`
880    and :class:`IntFlag` should be used only in cases where :class:`Enum` and
881    :class:`Flag` will not do; for example, when integer constants are replaced
882    with enumerations, or for interoperability with other systems.
883
884
885Others
886^^^^^^
887
888While :class:`IntEnum` is part of the :mod:`enum` module, it would be very
889simple to implement independently::
890
891    class IntEnum(int, ReprEnum):   # or Enum instead of ReprEnum
892        pass
893
894This demonstrates how similar derived enumerations can be defined; for example
895a :class:`!FloatEnum` that mixes in :class:`float` instead of :class:`int`.
896
897Some rules:
898
8991. When subclassing :class:`Enum`, mix-in types must appear before the
900   :class:`Enum` class itself in the sequence of bases, as in the :class:`IntEnum`
901   example above.
9022. Mix-in types must be subclassable. For example, :class:`bool` and
903   :class:`range` are not subclassable and will throw an error during Enum
904   creation if used as the mix-in type.
9053. While :class:`Enum` can have members of any type, once you mix in an
906   additional type, all the members must have values of that type, e.g.
907   :class:`int` above.  This restriction does not apply to mix-ins which only
908   add methods and don't specify another type.
9094. When another data type is mixed in, the :attr:`~Enum.value` attribute is *not the
910   same* as the enum member itself, although it is equivalent and will compare
911   equal.
9125. A ``data type`` is a mixin that defines :meth:`~object.__new__`, or a
913   :class:`~dataclasses.dataclass`
9146. %-style formatting:  ``%s`` and ``%r`` call the :class:`Enum` class's
915   :meth:`~object.__str__` and :meth:`~object.__repr__` respectively; other codes (such as
916   ``%i`` or ``%h`` for IntEnum) treat the enum member as its mixed-in type.
9177. :ref:`Formatted string literals <f-strings>`, :meth:`str.format`,
918   and :func:`format` will use the enum's :meth:`~object.__str__` method.
919
920.. note::
921
922   Because :class:`IntEnum`, :class:`IntFlag`, and :class:`StrEnum` are
923   designed to be drop-in replacements for existing constants, their
924   :meth:`~object.__str__` method has been reset to their data types'
925   :meth:`~object.__str__` method.
926
927.. _new-vs-init:
928
929When to use :meth:`~object.__new__` vs. :meth:`~object.__init__`
930----------------------------------------------------------------
931
932:meth:`~object.__new__` must be used whenever you want to customize the actual value of
933the :class:`Enum` member.  Any other modifications may go in either
934:meth:`~object.__new__` or :meth:`~object.__init__`, with :meth:`~object.__init__` being preferred.
935
936For example, if you want to pass several items to the constructor, but only
937want one of them to be the value::
938
939    >>> class Coordinate(bytes, Enum):
940    ...     """
941    ...     Coordinate with binary codes that can be indexed by the int code.
942    ...     """
943    ...     def __new__(cls, value, label, unit):
944    ...         obj = bytes.__new__(cls, [value])
945    ...         obj._value_ = value
946    ...         obj.label = label
947    ...         obj.unit = unit
948    ...         return obj
949    ...     PX = (0, 'P.X', 'km')
950    ...     PY = (1, 'P.Y', 'km')
951    ...     VX = (2, 'V.X', 'km/s')
952    ...     VY = (3, 'V.Y', 'km/s')
953    ...
954
955    >>> print(Coordinate['PY'])
956    Coordinate.PY
957
958    >>> print(Coordinate(3))
959    Coordinate.VY
960
961.. warning::
962
963    *Do not* call ``super().__new__()``, as the lookup-only ``__new__`` is the one
964    that is found; instead, use the data type directly.
965
966
967Finer Points
968^^^^^^^^^^^^
969
970Supported ``__dunder__`` names
971""""""""""""""""""""""""""""""
972
973:attr:`~enum.EnumType.__members__` is a read-only ordered mapping of ``member_name``:``member``
974items.  It is only available on the class.
975
976:meth:`~object.__new__`, if specified, must create and return the enum members; it is
977also a very good idea to set the member's :attr:`~Enum._value_` appropriately.  Once
978all the members are created it is no longer used.
979
980
981Supported ``_sunder_`` names
982""""""""""""""""""""""""""""
983
984- :attr:`~Enum._name_` -- name of the member
985- :attr:`~Enum._value_` -- value of the member; can be set in ``__new__``
986- :meth:`~Enum._missing_` -- a lookup function used when a value is not found;
987  may be overridden
988- :attr:`~Enum._ignore_` -- a list of names, either as a :class:`list` or a
989  :class:`str`, that will not be transformed into members, and will be removed
990  from the final class
991- :meth:`~Enum._generate_next_value_` -- used to get an appropriate value for
992  an enum member; may be overridden
993- :meth:`~EnumType._add_alias_` -- adds a new name as an alias to an existing
994  member.
995- :meth:`~EnumType._add_value_alias_` -- adds a new value as an alias to an
996  existing member.  See `MultiValueEnum`_ for an example.
997
998  .. note::
999
1000     For standard :class:`Enum` classes the next value chosen is the highest
1001     value seen incremented by one.
1002
1003     For :class:`Flag` classes the next value chosen will be the next highest
1004     power-of-two.
1005
1006  .. versionchanged:: 3.13
1007     Prior versions would use the last seen value instead of the highest value.
1008
1009.. versionadded:: 3.6 ``_missing_``, ``_order_``, ``_generate_next_value_``
1010.. versionadded:: 3.7 ``_ignore_``
1011.. versionadded:: 3.13 ``_add_alias_``, ``_add_value_alias_``
1012
1013To help keep Python 2 / Python 3 code in sync an :attr:`~Enum._order_` attribute can
1014be provided.  It will be checked against the actual order of the enumeration
1015and raise an error if the two do not match::
1016
1017    >>> class Color(Enum):
1018    ...     _order_ = 'RED GREEN BLUE'
1019    ...     RED = 1
1020    ...     BLUE = 3
1021    ...     GREEN = 2
1022    ...
1023    Traceback (most recent call last):
1024    ...
1025    TypeError: member order does not match _order_:
1026      ['RED', 'BLUE', 'GREEN']
1027      ['RED', 'GREEN', 'BLUE']
1028
1029.. note::
1030
1031    In Python 2 code the :attr:`~Enum._order_` attribute is necessary as definition
1032    order is lost before it can be recorded.
1033
1034
1035_Private__names
1036"""""""""""""""
1037
1038:ref:`Private names <private-name-mangling>` are not converted to enum members,
1039but remain normal attributes.
1040
1041.. versionchanged:: 3.11
1042
1043
1044``Enum`` member type
1045""""""""""""""""""""
1046
1047Enum members are instances of their enum class, and are normally accessed as
1048``EnumClass.member``.  In certain situations, such as writing custom enum
1049behavior, being able to access one member directly from another is useful,
1050and is supported; however, in order to avoid name clashes between member names
1051and attributes/methods from mixed-in classes, upper-case names are strongly
1052recommended.
1053
1054.. versionchanged:: 3.5
1055
1056
1057Creating members that are mixed with other data types
1058"""""""""""""""""""""""""""""""""""""""""""""""""""""
1059
1060When subclassing other data types, such as :class:`int` or :class:`str`, with
1061an :class:`Enum`, all values after the ``=`` are passed to that data type's
1062constructor.  For example::
1063
1064    >>> class MyEnum(IntEnum):      # help(int) -> int(x, base=10) -> integer
1065    ...     example = '11', 16      # so x='11' and base=16
1066    ...
1067    >>> MyEnum.example.value        # and hex(11) is...
1068    17
1069
1070
1071Boolean value of ``Enum`` classes and members
1072"""""""""""""""""""""""""""""""""""""""""""""
1073
1074Enum classes that are mixed with non-:class:`Enum` types (such as
1075:class:`int`, :class:`str`, etc.) are evaluated according to the mixed-in
1076type's rules; otherwise, all members evaluate as :data:`True`.  To make your
1077own enum's boolean evaluation depend on the member's value add the following to
1078your class::
1079
1080    def __bool__(self):
1081        return bool(self.value)
1082
1083Plain :class:`Enum` classes always evaluate as :data:`True`.
1084
1085
1086``Enum`` classes with methods
1087"""""""""""""""""""""""""""""
1088
1089If you give your enum subclass extra methods, like the `Planet`_
1090class below, those methods will show up in a :func:`dir` of the member,
1091but not of the class::
1092
1093    >>> dir(Planet)                         # doctest: +SKIP
1094    ['EARTH', 'JUPITER', 'MARS', 'MERCURY', 'NEPTUNE', 'SATURN', 'URANUS', 'VENUS', '__class__', '__doc__', '__members__', '__module__']
1095    >>> dir(Planet.EARTH)                   # doctest: +SKIP
1096    ['__class__', '__doc__', '__module__', 'mass', 'name', 'radius', 'surface_gravity', 'value']
1097
1098
1099Combining members of ``Flag``
1100"""""""""""""""""""""""""""""
1101
1102Iterating over a combination of :class:`Flag` members will only return the members that
1103are comprised of a single bit::
1104
1105    >>> class Color(Flag):
1106    ...     RED = auto()
1107    ...     GREEN = auto()
1108    ...     BLUE = auto()
1109    ...     MAGENTA = RED | BLUE
1110    ...     YELLOW = RED | GREEN
1111    ...     CYAN = GREEN | BLUE
1112    ...
1113    >>> Color(3)  # named combination
1114    <Color.YELLOW: 3>
1115    >>> Color(7)      # not named combination
1116    <Color.RED|GREEN|BLUE: 7>
1117
1118
1119``Flag`` and ``IntFlag`` minutia
1120""""""""""""""""""""""""""""""""
1121
1122Using the following snippet for our examples::
1123
1124    >>> class Color(IntFlag):
1125    ...     BLACK = 0
1126    ...     RED = 1
1127    ...     GREEN = 2
1128    ...     BLUE = 4
1129    ...     PURPLE = RED | BLUE
1130    ...     WHITE = RED | GREEN | BLUE
1131    ...
1132
1133the following are true:
1134
1135- single-bit flags are canonical
1136- multi-bit and zero-bit flags are aliases
1137- only canonical flags are returned during iteration::
1138
1139    >>> list(Color.WHITE)
1140    [<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 4>]
1141
1142- negating a flag or flag set returns a new flag/flag set with the
1143  corresponding positive integer value::
1144
1145    >>> Color.BLUE
1146    <Color.BLUE: 4>
1147
1148    >>> ~Color.BLUE
1149    <Color.RED|GREEN: 3>
1150
1151- names of pseudo-flags are constructed from their members' names::
1152
1153    >>> (Color.RED | Color.GREEN).name
1154    'RED|GREEN'
1155
1156    >>> class Perm(IntFlag):
1157    ...     R = 4
1158    ...     W = 2
1159    ...     X = 1
1160    ...
1161    >>> (Perm.R & Perm.W).name is None  # effectively Perm(0)
1162    True
1163
1164- multi-bit flags, aka aliases, can be returned from operations::
1165
1166    >>> Color.RED | Color.BLUE
1167    <Color.PURPLE: 5>
1168
1169    >>> Color(7)  # or Color(-1)
1170    <Color.WHITE: 7>
1171
1172    >>> Color(0)
1173    <Color.BLACK: 0>
1174
1175- membership / containment checking: zero-valued flags are always considered
1176  to be contained::
1177
1178    >>> Color.BLACK in Color.WHITE
1179    True
1180
1181  otherwise, only if all bits of one flag are in the other flag will True
1182  be returned::
1183
1184    >>> Color.PURPLE in Color.WHITE
1185    True
1186
1187    >>> Color.GREEN in Color.PURPLE
1188    False
1189
1190There is a new boundary mechanism that controls how out-of-range / invalid
1191bits are handled: ``STRICT``, ``CONFORM``, ``EJECT``, and ``KEEP``:
1192
1193* STRICT --> raises an exception when presented with invalid values
1194* CONFORM --> discards any invalid bits
1195* EJECT --> lose Flag status and become a normal int with the given value
1196* KEEP --> keep the extra bits
1197
1198  - keeps Flag status and extra bits
1199  - extra bits do not show up in iteration
1200  - extra bits do show up in repr() and str()
1201
1202The default for Flag is ``STRICT``, the default for ``IntFlag`` is ``EJECT``,
1203and the default for ``_convert_`` is ``KEEP`` (see ``ssl.Options`` for an
1204example of when ``KEEP`` is needed).
1205
1206
1207.. _enum-class-differences:
1208
1209How are Enums and Flags different?
1210----------------------------------
1211
1212Enums have a custom metaclass that affects many aspects of both derived :class:`Enum`
1213classes and their instances (members).
1214
1215
1216Enum Classes
1217^^^^^^^^^^^^
1218
1219The :class:`EnumType` metaclass is responsible for providing the
1220:meth:`~object.__contains__`, :meth:`~object.__dir__`, :meth:`~object.__iter__` and other methods that
1221allow one to do things with an :class:`Enum` class that fail on a typical
1222class, such as ``list(Color)`` or ``some_enum_var in Color``.  :class:`EnumType` is
1223responsible for ensuring that various other methods on the final :class:`Enum`
1224class are correct (such as :meth:`~object.__new__`, :meth:`~object.__getnewargs__`,
1225:meth:`~object.__str__` and :meth:`~object.__repr__`).
1226
1227Flag Classes
1228^^^^^^^^^^^^
1229
1230Flags have an expanded view of aliasing: to be canonical, the value of a flag
1231needs to be a power-of-two value, and not a duplicate name.  So, in addition to the
1232:class:`Enum` definition of alias, a flag with no value (a.k.a. ``0``) or with more than one
1233power-of-two value (e.g. ``3``) is considered an alias.
1234
1235Enum Members (aka instances)
1236^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1237
1238The most interesting thing about enum members is that they are singletons.
1239:class:`EnumType` creates them all while it is creating the enum class itself,
1240and then puts a custom :meth:`~object.__new__` in place to ensure that no new ones are
1241ever instantiated by returning only the existing member instances.
1242
1243Flag Members
1244^^^^^^^^^^^^
1245
1246Flag members can be iterated over just like the :class:`Flag` class, and only the
1247canonical members will be returned.  For example::
1248
1249    >>> list(Color)
1250    [<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 4>]
1251
1252(Note that ``BLACK``, ``PURPLE``, and ``WHITE`` do not show up.)
1253
1254Inverting a flag member returns the corresponding positive value,
1255rather than a negative value --- for example::
1256
1257    >>> ~Color.RED
1258    <Color.GREEN|BLUE: 6>
1259
1260Flag members have a length corresponding to the number of power-of-two values
1261they contain.  For example::
1262
1263    >>> len(Color.PURPLE)
1264    2
1265
1266
1267.. _enum-cookbook:
1268
1269Enum Cookbook
1270-------------
1271
1272
1273While :class:`Enum`, :class:`IntEnum`, :class:`StrEnum`, :class:`Flag`, and
1274:class:`IntFlag` are expected to cover the majority of use-cases, they cannot
1275cover them all.  Here are recipes for some different types of enumerations
1276that can be used directly, or as examples for creating one's own.
1277
1278
1279Omitting values
1280^^^^^^^^^^^^^^^
1281
1282In many use-cases, one doesn't care what the actual value of an enumeration
1283is. There are several ways to define this type of simple enumeration:
1284
1285- use instances of :class:`auto` for the value
1286- use instances of :class:`object` as the value
1287- use a descriptive string as the value
1288- use a tuple as the value and a custom :meth:`~object.__new__` to replace the
1289  tuple with an :class:`int` value
1290
1291Using any of these methods signifies to the user that these values are not
1292important, and also enables one to add, remove, or reorder members without
1293having to renumber the remaining members.
1294
1295
1296Using :class:`auto`
1297"""""""""""""""""""
1298
1299Using :class:`auto` would look like::
1300
1301    >>> class Color(Enum):
1302    ...     RED = auto()
1303    ...     BLUE = auto()
1304    ...     GREEN = auto()
1305    ...
1306    >>> Color.GREEN
1307    <Color.GREEN: 3>
1308
1309
1310Using :class:`object`
1311"""""""""""""""""""""
1312
1313Using :class:`object` would look like::
1314
1315    >>> class Color(Enum):
1316    ...     RED = object()
1317    ...     GREEN = object()
1318    ...     BLUE = object()
1319    ...
1320    >>> Color.GREEN                         # doctest: +SKIP
1321    <Color.GREEN: <object object at 0x...>>
1322
1323This is also a good example of why you might want to write your own
1324:meth:`~object.__repr__`::
1325
1326    >>> class Color(Enum):
1327    ...     RED = object()
1328    ...     GREEN = object()
1329    ...     BLUE = object()
1330    ...     def __repr__(self):
1331    ...         return "<%s.%s>" % (self.__class__.__name__, self._name_)
1332    ...
1333    >>> Color.GREEN
1334    <Color.GREEN>
1335
1336
1337
1338Using a descriptive string
1339""""""""""""""""""""""""""
1340
1341Using a string as the value would look like::
1342
1343    >>> class Color(Enum):
1344    ...     RED = 'stop'
1345    ...     GREEN = 'go'
1346    ...     BLUE = 'too fast!'
1347    ...
1348    >>> Color.GREEN
1349    <Color.GREEN: 'go'>
1350
1351
1352Using a custom :meth:`~object.__new__`
1353""""""""""""""""""""""""""""""""""""""
1354
1355Using an auto-numbering :meth:`~object.__new__` would look like::
1356
1357    >>> class AutoNumber(Enum):
1358    ...     def __new__(cls):
1359    ...         value = len(cls.__members__) + 1
1360    ...         obj = object.__new__(cls)
1361    ...         obj._value_ = value
1362    ...         return obj
1363    ...
1364    >>> class Color(AutoNumber):
1365    ...     RED = ()
1366    ...     GREEN = ()
1367    ...     BLUE = ()
1368    ...
1369    >>> Color.GREEN
1370    <Color.GREEN: 2>
1371
1372To make a more general purpose ``AutoNumber``, add ``*args`` to the signature::
1373
1374    >>> class AutoNumber(Enum):
1375    ...     def __new__(cls, *args):      # this is the only change from above
1376    ...         value = len(cls.__members__) + 1
1377    ...         obj = object.__new__(cls)
1378    ...         obj._value_ = value
1379    ...         return obj
1380    ...
1381
1382Then when you inherit from ``AutoNumber`` you can write your own ``__init__``
1383to handle any extra arguments::
1384
1385    >>> class Swatch(AutoNumber):
1386    ...     def __init__(self, pantone='unknown'):
1387    ...         self.pantone = pantone
1388    ...     AUBURN = '3497'
1389    ...     SEA_GREEN = '1246'
1390    ...     BLEACHED_CORAL = () # New color, no Pantone code yet!
1391    ...
1392    >>> Swatch.SEA_GREEN
1393    <Swatch.SEA_GREEN: 2>
1394    >>> Swatch.SEA_GREEN.pantone
1395    '1246'
1396    >>> Swatch.BLEACHED_CORAL.pantone
1397    'unknown'
1398
1399.. note::
1400
1401    The :meth:`~object.__new__` method, if defined, is used during creation of the Enum
1402    members; it is then replaced by Enum's :meth:`~object.__new__` which is used after
1403    class creation for lookup of existing members.
1404
1405.. warning::
1406
1407    *Do not* call ``super().__new__()``, as the lookup-only ``__new__`` is the one
1408    that is found; instead, use the data type directly -- e.g.::
1409
1410       obj = int.__new__(cls, value)
1411
1412
1413OrderedEnum
1414^^^^^^^^^^^
1415
1416An ordered enumeration that is not based on :class:`IntEnum` and so maintains
1417the normal :class:`Enum` invariants (such as not being comparable to other
1418enumerations)::
1419
1420    >>> class OrderedEnum(Enum):
1421    ...     def __ge__(self, other):
1422    ...         if self.__class__ is other.__class__:
1423    ...             return self.value >= other.value
1424    ...         return NotImplemented
1425    ...     def __gt__(self, other):
1426    ...         if self.__class__ is other.__class__:
1427    ...             return self.value > other.value
1428    ...         return NotImplemented
1429    ...     def __le__(self, other):
1430    ...         if self.__class__ is other.__class__:
1431    ...             return self.value <= other.value
1432    ...         return NotImplemented
1433    ...     def __lt__(self, other):
1434    ...         if self.__class__ is other.__class__:
1435    ...             return self.value < other.value
1436    ...         return NotImplemented
1437    ...
1438    >>> class Grade(OrderedEnum):
1439    ...     A = 5
1440    ...     B = 4
1441    ...     C = 3
1442    ...     D = 2
1443    ...     F = 1
1444    ...
1445    >>> Grade.C < Grade.A
1446    True
1447
1448
1449DuplicateFreeEnum
1450^^^^^^^^^^^^^^^^^
1451
1452Raises an error if a duplicate member value is found instead of creating an
1453alias::
1454
1455    >>> class DuplicateFreeEnum(Enum):
1456    ...     def __init__(self, *args):
1457    ...         cls = self.__class__
1458    ...         if any(self.value == e.value for e in cls):
1459    ...             a = self.name
1460    ...             e = cls(self.value).name
1461    ...             raise ValueError(
1462    ...                 "aliases not allowed in DuplicateFreeEnum:  %r --> %r"
1463    ...                 % (a, e))
1464    ...
1465    >>> class Color(DuplicateFreeEnum):
1466    ...     RED = 1
1467    ...     GREEN = 2
1468    ...     BLUE = 3
1469    ...     GRENE = 2
1470    ...
1471    Traceback (most recent call last):
1472      ...
1473    ValueError: aliases not allowed in DuplicateFreeEnum:  'GRENE' --> 'GREEN'
1474
1475.. note::
1476
1477    This is a useful example for subclassing Enum to add or change other
1478    behaviors as well as disallowing aliases.  If the only desired change is
1479    disallowing aliases, the :func:`unique` decorator can be used instead.
1480
1481
1482MultiValueEnum
1483^^^^^^^^^^^^^^^^^
1484
1485Supports having more than one value per member::
1486
1487    >>> class MultiValueEnum(Enum):
1488    ...     def __new__(cls, value, *values):
1489    ...         self = object.__new__(cls)
1490    ...         self._value_ = value
1491    ...         for v in values:
1492    ...             self._add_value_alias_(v)
1493    ...         return self
1494    ...
1495    >>> class DType(MultiValueEnum):
1496    ...     float32 = 'f', 8
1497    ...     double64 = 'd', 9
1498    ...
1499    >>> DType('f')
1500    <DType.float32: 'f'>
1501    >>> DType(9)
1502    <DType.double64: 'd'>
1503
1504
1505Planet
1506^^^^^^
1507
1508If :meth:`~object.__new__` or :meth:`~object.__init__` is defined, the value of the enum member
1509will be passed to those methods::
1510
1511    >>> class Planet(Enum):
1512    ...     MERCURY = (3.303e+23, 2.4397e6)
1513    ...     VENUS   = (4.869e+24, 6.0518e6)
1514    ...     EARTH   = (5.976e+24, 6.37814e6)
1515    ...     MARS    = (6.421e+23, 3.3972e6)
1516    ...     JUPITER = (1.9e+27,   7.1492e7)
1517    ...     SATURN  = (5.688e+26, 6.0268e7)
1518    ...     URANUS  = (8.686e+25, 2.5559e7)
1519    ...     NEPTUNE = (1.024e+26, 2.4746e7)
1520    ...     def __init__(self, mass, radius):
1521    ...         self.mass = mass       # in kilograms
1522    ...         self.radius = radius   # in meters
1523    ...     @property
1524    ...     def surface_gravity(self):
1525    ...         # universal gravitational constant  (m3 kg-1 s-2)
1526    ...         G = 6.67300E-11
1527    ...         return G * self.mass / (self.radius * self.radius)
1528    ...
1529    >>> Planet.EARTH.value
1530    (5.976e+24, 6378140.0)
1531    >>> Planet.EARTH.surface_gravity
1532    9.802652743337129
1533
1534.. _enum-time-period:
1535
1536TimePeriod
1537^^^^^^^^^^
1538
1539An example to show the :attr:`~Enum._ignore_` attribute in use::
1540
1541    >>> from datetime import timedelta
1542    >>> class Period(timedelta, Enum):
1543    ...     "different lengths of time"
1544    ...     _ignore_ = 'Period i'
1545    ...     Period = vars()
1546    ...     for i in range(367):
1547    ...         Period['day_%d' % i] = i
1548    ...
1549    >>> list(Period)[:2]
1550    [<Period.day_0: datetime.timedelta(0)>, <Period.day_1: datetime.timedelta(days=1)>]
1551    >>> list(Period)[-2:]
1552    [<Period.day_365: datetime.timedelta(days=365)>, <Period.day_366: datetime.timedelta(days=366)>]
1553
1554
1555.. _enumtype-examples:
1556
1557Subclassing EnumType
1558--------------------
1559
1560While most enum needs can be met by customizing :class:`Enum` subclasses,
1561either with class decorators or custom functions, :class:`EnumType` can be
1562subclassed to provide a different Enum experience.
1563