mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1002 lines
		
	
	
	
		
			31 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			1002 lines
		
	
	
	
		
			31 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| :mod:`!enum` --- Support for enumerations
 | |
| =========================================
 | |
| 
 | |
| .. module:: enum
 | |
|    :synopsis: Implementation of an enumeration class.
 | |
| 
 | |
| .. moduleauthor:: Ethan Furman <ethan@stoneleaf.us>
 | |
| .. sectionauthor:: Barry Warsaw <barry@python.org>
 | |
| .. sectionauthor:: Eli Bendersky <eliben@gmail.com>
 | |
| .. sectionauthor:: Ethan Furman <ethan@stoneleaf.us>
 | |
| 
 | |
| .. versionadded:: 3.4
 | |
| 
 | |
| **Source code:** :source:`Lib/enum.py`
 | |
| 
 | |
| .. sidebar:: Important
 | |
| 
 | |
|    This page contains the API reference information. For tutorial
 | |
|    information and discussion of more advanced topics, see
 | |
| 
 | |
|    * :ref:`Basic Tutorial <enum-basic-tutorial>`
 | |
|    * :ref:`Advanced Tutorial <enum-advanced-tutorial>`
 | |
|    * :ref:`Enum Cookbook <enum-cookbook>`
 | |
| 
 | |
| ---------------
 | |
| 
 | |
| An enumeration:
 | |
| 
 | |
| * is a set of symbolic names (members) bound to unique values
 | |
| * can be iterated over to return its canonical (i.e. non-alias) members in
 | |
|   definition order
 | |
| * uses *call* syntax to return members by value
 | |
| * uses *index* syntax to return members by name
 | |
| 
 | |
| Enumerations are created either by using :keyword:`class` syntax, or by
 | |
| using function-call syntax::
 | |
| 
 | |
|    >>> from enum import Enum
 | |
| 
 | |
|    >>> # class syntax
 | |
|    >>> class Color(Enum):
 | |
|    ...     RED = 1
 | |
|    ...     GREEN = 2
 | |
|    ...     BLUE = 3
 | |
| 
 | |
|    >>> # functional syntax
 | |
|    >>> Color = Enum('Color', ['RED', 'GREEN', 'BLUE'])
 | |
| 
 | |
| Even though we can use :keyword:`class` syntax to create Enums, Enums
 | |
| are not normal Python classes.  See
 | |
| :ref:`How are Enums different? <enum-class-differences>` for more details.
 | |
| 
 | |
| .. note:: Nomenclature
 | |
| 
 | |
|    - The class :class:`!Color` is an *enumeration* (or *enum*)
 | |
|    - The attributes :attr:`!Color.RED`, :attr:`!Color.GREEN`, etc., are
 | |
|      *enumeration members* (or *members*) and are functionally constants.
 | |
|    - The enum members have *names* and *values* (the name of
 | |
|      :attr:`!Color.RED` is ``RED``, the value of :attr:`!Color.BLUE` is
 | |
|      ``3``, etc.)
 | |
| 
 | |
| ---------------
 | |
| 
 | |
| Module Contents
 | |
| ---------------
 | |
| 
 | |
|    :class:`EnumType`
 | |
| 
 | |
|       The ``type`` for Enum and its subclasses.
 | |
| 
 | |
|    :class:`Enum`
 | |
| 
 | |
|       Base class for creating enumerated constants.
 | |
| 
 | |
|    :class:`IntEnum`
 | |
| 
 | |
|       Base class for creating enumerated constants that are also
 | |
|       subclasses of :class:`int`. (`Notes`_)
 | |
| 
 | |
|    :class:`StrEnum`
 | |
| 
 | |
|       Base class for creating enumerated constants that are also
 | |
|       subclasses of :class:`str`. (`Notes`_)
 | |
| 
 | |
|    :class:`Flag`
 | |
| 
 | |
|       Base class for creating enumerated constants that can be combined using
 | |
|       the bitwise operations without losing their :class:`Flag` membership.
 | |
| 
 | |
|    :class:`IntFlag`
 | |
| 
 | |
|       Base class for creating enumerated constants that can be combined using
 | |
|       the bitwise operators without losing their :class:`IntFlag` membership.
 | |
|       :class:`IntFlag` members are also subclasses of :class:`int`. (`Notes`_)
 | |
| 
 | |
|    :class:`ReprEnum`
 | |
| 
 | |
|       Used by :class:`IntEnum`, :class:`StrEnum`, and :class:`IntFlag`
 | |
|       to keep the :class:`str() <str>` of the mixed-in type.
 | |
| 
 | |
|    :class:`EnumCheck`
 | |
| 
 | |
|       An enumeration with the values ``CONTINUOUS``, ``NAMED_FLAGS``, and
 | |
|       ``UNIQUE``, for use with :func:`verify` to ensure various constraints
 | |
|       are met by a given enumeration.
 | |
| 
 | |
|    :class:`FlagBoundary`
 | |
| 
 | |
|       An enumeration with the values ``STRICT``, ``CONFORM``, ``EJECT``, and
 | |
|       ``KEEP`` which allows for more fine-grained control over how invalid values
 | |
|       are dealt with in an enumeration.
 | |
| 
 | |
|    :class:`auto`
 | |
| 
 | |
|       Instances are replaced with an appropriate value for Enum members.
 | |
|       :class:`StrEnum` defaults to the lower-cased version of the member name,
 | |
|       while other Enums default to 1 and increase from there.
 | |
| 
 | |
|    :func:`~enum.property`
 | |
| 
 | |
|       Allows :class:`Enum` members to have attributes without conflicting with
 | |
|       member names.  The ``value`` and ``name`` attributes are implemented this
 | |
|       way.
 | |
| 
 | |
|    :func:`unique`
 | |
| 
 | |
|       Enum class decorator that ensures only one name is bound to any one value.
 | |
| 
 | |
|    :func:`verify`
 | |
| 
 | |
|       Enum class decorator that checks user-selectable constraints on an
 | |
|       enumeration.
 | |
| 
 | |
|    :func:`member`
 | |
| 
 | |
|       Make ``obj`` a member.  Can be used as a decorator.
 | |
| 
 | |
|    :func:`nonmember`
 | |
| 
 | |
|       Do not make ``obj`` a member.  Can be used as a decorator.
 | |
| 
 | |
|    :func:`global_enum`
 | |
| 
 | |
|       Modify the :class:`str() <str>` and :func:`repr` of an enum
 | |
|       to show its members as belonging to the module instead of its class,
 | |
|       and export the enum members to the global namespace.
 | |
| 
 | |
|    :func:`show_flag_values`
 | |
| 
 | |
|       Return a list of all power-of-two integers contained in a flag.
 | |
| 
 | |
| 
 | |
| .. versionadded:: 3.6  ``Flag``, ``IntFlag``, ``auto``
 | |
| .. versionadded:: 3.11  ``StrEnum``, ``EnumCheck``, ``ReprEnum``, ``FlagBoundary``, ``property``, ``member``, ``nonmember``, ``global_enum``, ``show_flag_values``
 | |
| 
 | |
| ---------------
 | |
| 
 | |
| Data Types
 | |
| ----------
 | |
| 
 | |
| 
 | |
| .. class:: EnumType
 | |
| 
 | |
|    *EnumType* is the :term:`metaclass` for *enum* enumerations.  It is possible
 | |
|    to subclass *EnumType* -- see :ref:`Subclassing EnumType <enumtype-examples>`
 | |
|    for details.
 | |
| 
 | |
|    ``EnumType`` is responsible for setting the correct :meth:`!__repr__`,
 | |
|    :meth:`!__str__`, :meth:`!__format__`, and :meth:`!__reduce__` methods on the
 | |
|    final *enum*, as well as creating the enum members, properly handling
 | |
|    duplicates, providing iteration over the enum class, etc.
 | |
| 
 | |
|    .. method:: EnumType.__call__(cls, value, names=None, *, module=None, qualname=None, type=None, start=1, boundary=None)
 | |
| 
 | |
|       This method is called in two different ways:
 | |
| 
 | |
|       * to look up an existing member:
 | |
| 
 | |
|          :cls:   The enum class being called.
 | |
|          :value: The value to lookup.
 | |
| 
 | |
|       * to use the ``cls`` enum to create a new enum (only if the existing enum
 | |
|         does not have any members):
 | |
| 
 | |
|          :cls:   The enum class being called.
 | |
|          :value: The name of the new Enum to create.
 | |
|          :names: The names/values of the members for the new Enum.
 | |
|          :module:    The name of the module the new Enum is created in.
 | |
|          :qualname:  The actual location in the module where this Enum can be found.
 | |
|          :type:  A mix-in type for the new Enum.
 | |
|          :start: The first integer value for the Enum (used by :class:`auto`).
 | |
|          :boundary:  How to handle out-of-range values from bit operations (:class:`Flag` only).
 | |
| 
 | |
|    .. method:: EnumType.__contains__(cls, member)
 | |
| 
 | |
|       Returns ``True`` if member belongs to the ``cls``::
 | |
| 
 | |
|         >>> some_var = Color.RED
 | |
|         >>> some_var in Color
 | |
|         True
 | |
|         >>> Color.RED.value in Color
 | |
|         True
 | |
| 
 | |
|    .. versionchanged:: 3.12
 | |
| 
 | |
|          Before Python 3.12, a ``TypeError`` is raised if a
 | |
|          non-Enum-member is used in a containment check.
 | |
| 
 | |
|    .. method:: EnumType.__dir__(cls)
 | |
| 
 | |
|       Returns ``['__class__', '__doc__', '__members__', '__module__']`` and the
 | |
|       names of the members in *cls*::
 | |
| 
 | |
|         >>> dir(Color)
 | |
|         ['BLUE', 'GREEN', 'RED', '__class__', '__contains__', '__doc__', '__getitem__', '__init_subclass__', '__iter__', '__len__', '__members__', '__module__', '__name__', '__qualname__']
 | |
| 
 | |
|    .. method:: EnumType.__getitem__(cls, name)
 | |
| 
 | |
|       Returns the Enum member in *cls* matching *name*, or raises a :exc:`KeyError`::
 | |
| 
 | |
|         >>> Color['BLUE']
 | |
|         <Color.BLUE: 3>
 | |
| 
 | |
|    .. method:: EnumType.__iter__(cls)
 | |
| 
 | |
|       Returns each member in *cls* in definition order::
 | |
| 
 | |
|         >>> list(Color)
 | |
|         [<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
 | |
| 
 | |
|    .. method:: EnumType.__len__(cls)
 | |
| 
 | |
|       Returns the number of member in *cls*::
 | |
| 
 | |
|         >>> len(Color)
 | |
|         3
 | |
| 
 | |
|    .. attribute:: EnumType.__members__
 | |
| 
 | |
|       Returns a mapping of every enum name to its member, including aliases
 | |
| 
 | |
|    .. method:: EnumType.__reversed__(cls)
 | |
| 
 | |
|       Returns each member in *cls* in reverse definition order::
 | |
| 
 | |
|         >>> list(reversed(Color))
 | |
|         [<Color.BLUE: 3>, <Color.GREEN: 2>, <Color.RED: 1>]
 | |
| 
 | |
|    .. method:: EnumType._add_alias_
 | |
| 
 | |
|       Adds a new name as an alias to an existing member.  Raises a
 | |
|       :exc:`NameError` if the name is already assigned to a different member.
 | |
| 
 | |
|    .. method:: EnumType._add_value_alias_
 | |
| 
 | |
|       Adds a new value as an alias to an existing member.  Raises a
 | |
|       :exc:`ValueError` if the value is already linked with a different member.
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
|       Before 3.11 ``EnumType`` was called ``EnumMeta``, which is still available as an alias.
 | |
| 
 | |
| 
 | |
| .. class:: Enum
 | |
| 
 | |
|    *Enum* is the base class for all *enum* enumerations.
 | |
| 
 | |
|    .. attribute:: Enum.name
 | |
| 
 | |
|       The name used to define the ``Enum`` member::
 | |
| 
 | |
|         >>> Color.BLUE.name
 | |
|         'BLUE'
 | |
| 
 | |
|    .. attribute:: Enum.value
 | |
| 
 | |
|       The value given to the ``Enum`` member::
 | |
| 
 | |
|          >>> Color.RED.value
 | |
|          1
 | |
| 
 | |
|       Value of the member, can be set in :meth:`~Enum.__new__`.
 | |
| 
 | |
|       .. note:: Enum member values
 | |
| 
 | |
|          Member values can be anything: :class:`int`, :class:`str`, etc.  If
 | |
|          the exact value is unimportant you may use :class:`auto` instances and an
 | |
|          appropriate value will be chosen for you.  See :class:`auto` for the
 | |
|          details.
 | |
| 
 | |
|          While mutable/unhashable values, such as :class:`dict`, :class:`list` or
 | |
|          a mutable :class:`~dataclasses.dataclass`, can be used, they will have a
 | |
|          quadratic performance impact during creation relative to the
 | |
|          total number of mutable/unhashable values in the enum.
 | |
| 
 | |
|    .. attribute:: Enum._name_
 | |
| 
 | |
|       Name of the member.
 | |
| 
 | |
|    .. attribute:: Enum._value_
 | |
| 
 | |
|       Value of the member, can be set in :meth:`~Enum.__new__`.
 | |
| 
 | |
|    .. attribute:: Enum._order_
 | |
| 
 | |
|       No longer used, kept for backward compatibility.
 | |
|       (class attribute, removed during class creation).
 | |
| 
 | |
|    .. attribute:: Enum._ignore_
 | |
| 
 | |
|       ``_ignore_`` is only used during creation and is removed from the
 | |
|       enumeration once creation is complete.
 | |
| 
 | |
|       ``_ignore_`` is a list of names that will not become members, and whose
 | |
|       names will also be removed from the completed enumeration.  See
 | |
|       :ref:`TimePeriod <enum-time-period>` for an example.
 | |
| 
 | |
|    .. method:: Enum.__dir__(self)
 | |
| 
 | |
|       Returns ``['__class__', '__doc__', '__module__', 'name', 'value']`` and
 | |
|       any public methods defined on *self.__class__*::
 | |
| 
 | |
|          >>> from datetime import date
 | |
|          >>> class Weekday(Enum):
 | |
|          ...     MONDAY = 1
 | |
|          ...     TUESDAY = 2
 | |
|          ...     WEDNESDAY = 3
 | |
|          ...     THURSDAY = 4
 | |
|          ...     FRIDAY = 5
 | |
|          ...     SATURDAY = 6
 | |
|          ...     SUNDAY = 7
 | |
|          ...     @classmethod
 | |
|          ...     def today(cls):
 | |
|          ...         print('today is %s' % cls(date.today().isoweekday()).name)
 | |
|          ...
 | |
|          >>> dir(Weekday.SATURDAY)
 | |
|          ['__class__', '__doc__', '__eq__', '__hash__', '__module__', 'name', 'today', 'value']
 | |
| 
 | |
|    .. method:: Enum._generate_next_value_(name, start, count, last_values)
 | |
| 
 | |
|          :name: The name of the member being defined (e.g. 'RED').
 | |
|          :start: The start value for the Enum; the default is 1.
 | |
|          :count: The number of members currently defined, not including this one.
 | |
|          :last_values: A list of the previous values.
 | |
| 
 | |
|       A *staticmethod* that is used to determine the next value returned by
 | |
|       :class:`auto`::
 | |
| 
 | |
|          >>> from enum import auto
 | |
|          >>> class PowersOfThree(Enum):
 | |
|          ...     @staticmethod
 | |
|          ...     def _generate_next_value_(name, start, count, last_values):
 | |
|          ...         return 3 ** (count + 1)
 | |
|          ...     FIRST = auto()
 | |
|          ...     SECOND = auto()
 | |
|          ...
 | |
|          >>> PowersOfThree.SECOND.value
 | |
|          9
 | |
| 
 | |
|    .. method:: Enum.__init__(self, *args, **kwds)
 | |
| 
 | |
|       By default, does nothing.  If multiple values are given in the member
 | |
|       assignment, those values become separate arguments to ``__init__``; e.g.
 | |
| 
 | |
|          >>> from enum import Enum
 | |
|          >>> class Weekday(Enum):
 | |
|          ...     MONDAY = 1, 'Mon'
 | |
| 
 | |
|       ``Weekday.__init__()`` would be called as ``Weekday.__init__(self, 1, 'Mon')``
 | |
| 
 | |
|    .. method:: Enum.__init_subclass__(cls, **kwds)
 | |
| 
 | |
|       A *classmethod* that is used to further configure subsequent subclasses.
 | |
|       By default, does nothing.
 | |
| 
 | |
|    .. method:: Enum._missing_(cls, value)
 | |
| 
 | |
|       A *classmethod* for looking up values not found in *cls*.  By default it
 | |
|       does nothing, but can be overridden to implement custom search behavior::
 | |
| 
 | |
|          >>> from enum import StrEnum
 | |
|          >>> class Build(StrEnum):
 | |
|          ...     DEBUG = auto()
 | |
|          ...     OPTIMIZED = auto()
 | |
|          ...     @classmethod
 | |
|          ...     def _missing_(cls, value):
 | |
|          ...         value = value.lower()
 | |
|          ...         for member in cls:
 | |
|          ...             if member.value == value:
 | |
|          ...                 return member
 | |
|          ...         return None
 | |
|          ...
 | |
|          >>> Build.DEBUG.value
 | |
|          'debug'
 | |
|          >>> Build('deBUG')
 | |
|          <Build.DEBUG: 'debug'>
 | |
| 
 | |
|    .. method:: Enum.__new__(cls, *args, **kwds)
 | |
| 
 | |
|       By default, doesn't exist.  If specified, either in the enum class
 | |
|       definition or in a mixin class (such as ``int``), all values given
 | |
|       in the member assignment will be passed; e.g.
 | |
| 
 | |
|          >>> from enum import Enum
 | |
|          >>> class MyIntEnum(int, Enum):
 | |
|          ...     TWENTYSIX = '1a', 16
 | |
| 
 | |
|       results in the call ``int('1a', 16)`` and a value of ``26`` for the member.
 | |
| 
 | |
|       .. note::
 | |
| 
 | |
|          When writing a custom ``__new__``, do not use ``super().__new__`` --
 | |
|          call the appropriate ``__new__`` instead.
 | |
| 
 | |
|    .. method:: Enum.__repr__(self)
 | |
| 
 | |
|       Returns the string used for *repr()* calls.  By default, returns the
 | |
|       *Enum* name, member name, and value, but can be overridden::
 | |
| 
 | |
|          >>> class OtherStyle(Enum):
 | |
|          ...     ALTERNATE = auto()
 | |
|          ...     OTHER = auto()
 | |
|          ...     SOMETHING_ELSE = auto()
 | |
|          ...     def __repr__(self):
 | |
|          ...         cls_name = self.__class__.__name__
 | |
|          ...         return f'{cls_name}.{self.name}'
 | |
|          ...
 | |
|          >>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"{OtherStyle.ALTERNATE}"
 | |
|          (OtherStyle.ALTERNATE, 'OtherStyle.ALTERNATE', 'OtherStyle.ALTERNATE')
 | |
| 
 | |
|    .. method:: Enum.__str__(self)
 | |
| 
 | |
|       Returns the string used for *str()* calls.  By default, returns the
 | |
|       *Enum* name and member name, but can be overridden::
 | |
| 
 | |
|          >>> class OtherStyle(Enum):
 | |
|          ...     ALTERNATE = auto()
 | |
|          ...     OTHER = auto()
 | |
|          ...     SOMETHING_ELSE = auto()
 | |
|          ...     def __str__(self):
 | |
|          ...         return f'{self.name}'
 | |
|          ...
 | |
|          >>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"{OtherStyle.ALTERNATE}"
 | |
|          (<OtherStyle.ALTERNATE: 1>, 'ALTERNATE', 'ALTERNATE')
 | |
| 
 | |
|    .. method:: Enum.__format__(self)
 | |
| 
 | |
|       Returns the string used for *format()* and *f-string* calls.  By default,
 | |
|       returns :meth:`__str__` return value, but can be overridden::
 | |
| 
 | |
|          >>> class OtherStyle(Enum):
 | |
|          ...     ALTERNATE = auto()
 | |
|          ...     OTHER = auto()
 | |
|          ...     SOMETHING_ELSE = auto()
 | |
|          ...     def __format__(self, spec):
 | |
|          ...         return f'{self.name}'
 | |
|          ...
 | |
|          >>> OtherStyle.ALTERNATE, str(OtherStyle.ALTERNATE), f"{OtherStyle.ALTERNATE}"
 | |
|          (<OtherStyle.ALTERNATE: 1>, 'OtherStyle.ALTERNATE', 'ALTERNATE')
 | |
| 
 | |
|    .. note::
 | |
| 
 | |
|       Using :class:`auto` with :class:`Enum` results in integers of increasing value,
 | |
|       starting with ``1``.
 | |
| 
 | |
|    .. versionchanged:: 3.12 Added :ref:`enum-dataclass-support`
 | |
| 
 | |
| 
 | |
| .. class:: IntEnum
 | |
| 
 | |
|    *IntEnum* is the same as :class:`Enum`, but its members are also integers and can be
 | |
|    used anywhere that an integer can be used.  If any integer operation is performed
 | |
|    with an *IntEnum* member, the resulting value loses its enumeration status.
 | |
| 
 | |
|       >>> from enum import IntEnum
 | |
|       >>> class Number(IntEnum):
 | |
|       ...     ONE = 1
 | |
|       ...     TWO = 2
 | |
|       ...     THREE = 3
 | |
|       ...
 | |
|       >>> Number.THREE
 | |
|       <Number.THREE: 3>
 | |
|       >>> Number.ONE + Number.TWO
 | |
|       3
 | |
|       >>> Number.THREE + 5
 | |
|       8
 | |
|       >>> Number.THREE == 3
 | |
|       True
 | |
| 
 | |
|    .. note::
 | |
| 
 | |
|       Using :class:`auto` with :class:`IntEnum` results in integers of increasing
 | |
|       value, starting with ``1``.
 | |
| 
 | |
|    .. versionchanged:: 3.11 :meth:`~object.__str__` is now :meth:`!int.__str__` to
 | |
|       better support the *replacement of existing constants* use-case.
 | |
|       :meth:`~object.__format__` was already :meth:`!int.__format__` for that same reason.
 | |
| 
 | |
| 
 | |
| .. class:: StrEnum
 | |
| 
 | |
|    ``StrEnum`` is the same as :class:`Enum`, but its members are also strings and can be used
 | |
|    in most of the same places that a string can be used.  The result of any string
 | |
|    operation performed on or with a *StrEnum* member is not part of the enumeration.
 | |
| 
 | |
|    .. note::
 | |
| 
 | |
|       There are places in the stdlib that check for an exact :class:`str`
 | |
|       instead of a :class:`str` subclass (i.e. ``type(unknown) == str``
 | |
|       instead of ``isinstance(unknown, str)``), and in those locations you
 | |
|       will need to use ``str(StrEnum.member)``.
 | |
| 
 | |
|    .. note::
 | |
| 
 | |
|       Using :class:`auto` with :class:`StrEnum` results in the lower-cased member
 | |
|       name as the value.
 | |
| 
 | |
|    .. note::
 | |
| 
 | |
|       :meth:`~object.__str__` is :meth:`!str.__str__` to better support the
 | |
|       *replacement of existing constants* use-case.  :meth:`~object.__format__` is likewise
 | |
|       :meth:`!str.__format__` for that same reason.
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
| .. class:: Flag
 | |
| 
 | |
|    ``Flag`` is the same as :class:`Enum`, but its members support the bitwise
 | |
|    operators ``&`` (*AND*), ``|`` (*OR*), ``^`` (*XOR*), and ``~`` (*INVERT*);
 | |
|    the results of those operators are members of the enumeration.
 | |
| 
 | |
|    .. method:: __contains__(self, value)
 | |
| 
 | |
|       Returns *True* if value is in self::
 | |
| 
 | |
|          >>> from enum import Flag, auto
 | |
|          >>> class Color(Flag):
 | |
|          ...     RED = auto()
 | |
|          ...     GREEN = auto()
 | |
|          ...     BLUE = auto()
 | |
|          ...
 | |
|          >>> purple = Color.RED | Color.BLUE
 | |
|          >>> white = Color.RED | Color.GREEN | Color.BLUE
 | |
|          >>> Color.GREEN in purple
 | |
|          False
 | |
|          >>> Color.GREEN in white
 | |
|          True
 | |
|          >>> purple in white
 | |
|          True
 | |
|          >>> white in purple
 | |
|          False
 | |
| 
 | |
|    .. method:: __iter__(self):
 | |
| 
 | |
|       Returns all contained non-alias members::
 | |
| 
 | |
|          >>> list(Color.RED)
 | |
|          [<Color.RED: 1>]
 | |
|          >>> list(purple)
 | |
|          [<Color.RED: 1>, <Color.BLUE: 4>]
 | |
| 
 | |
|       .. versionadded:: 3.11
 | |
| 
 | |
|    .. method:: __len__(self):
 | |
| 
 | |
|       Returns number of members in flag::
 | |
| 
 | |
|          >>> len(Color.GREEN)
 | |
|          1
 | |
|          >>> len(white)
 | |
|          3
 | |
| 
 | |
|    .. method:: __bool__(self):
 | |
| 
 | |
|       Returns *True* if any members in flag, *False* otherwise::
 | |
| 
 | |
|          >>> bool(Color.GREEN)
 | |
|          True
 | |
|          >>> bool(white)
 | |
|          True
 | |
|          >>> black = Color(0)
 | |
|          >>> bool(black)
 | |
|          False
 | |
| 
 | |
|    .. method:: __or__(self, other)
 | |
| 
 | |
|       Returns current flag binary or'ed with other::
 | |
| 
 | |
|          >>> Color.RED | Color.GREEN
 | |
|          <Color.RED|GREEN: 3>
 | |
| 
 | |
|    .. method:: __and__(self, other)
 | |
| 
 | |
|       Returns current flag binary and'ed with other::
 | |
| 
 | |
|          >>> purple & white
 | |
|          <Color.RED|BLUE: 5>
 | |
|          >>> purple & Color.GREEN
 | |
|          <Color: 0>
 | |
| 
 | |
|    .. method:: __xor__(self, other)
 | |
| 
 | |
|       Returns current flag binary xor'ed with other::
 | |
| 
 | |
|          >>> purple ^ white
 | |
|          <Color.GREEN: 2>
 | |
|          >>> purple ^ Color.GREEN
 | |
|          <Color.RED|GREEN|BLUE: 7>
 | |
| 
 | |
|    .. method:: __invert__(self):
 | |
| 
 | |
|       Returns all the flags in *type(self)* that are not in *self*::
 | |
| 
 | |
|          >>> ~white
 | |
|          <Color: 0>
 | |
|          >>> ~purple
 | |
|          <Color.GREEN: 2>
 | |
|          >>> ~Color.RED
 | |
|          <Color.GREEN|BLUE: 6>
 | |
| 
 | |
|    .. method:: _numeric_repr_
 | |
| 
 | |
|       Function used to format any remaining unnamed numeric values.  Default is
 | |
|       the value's repr; common choices are :func:`hex` and :func:`oct`.
 | |
| 
 | |
|    .. note::
 | |
| 
 | |
|       Using :class:`auto` with :class:`Flag` results in integers that are powers
 | |
|       of two, starting with ``1``.
 | |
| 
 | |
|    .. versionchanged:: 3.11 The *repr()* of zero-valued flags has changed.  It
 | |
|       is now::
 | |
| 
 | |
|          >>> Color(0) # doctest: +SKIP
 | |
|          <Color: 0>
 | |
| 
 | |
| .. class:: IntFlag
 | |
| 
 | |
|    ``IntFlag`` is the same as :class:`Flag`, but its members are also integers and can be
 | |
|    used anywhere that an integer can be used.
 | |
| 
 | |
|       >>> from enum import IntFlag, auto
 | |
|       >>> class Color(IntFlag):
 | |
|       ...     RED = auto()
 | |
|       ...     GREEN = auto()
 | |
|       ...     BLUE = auto()
 | |
|       ...
 | |
|       >>> Color.RED & 2
 | |
|       <Color: 0>
 | |
|       >>> Color.RED | 2
 | |
|       <Color.RED|GREEN: 3>
 | |
| 
 | |
|    If any integer operation is performed with an *IntFlag* member, the result is
 | |
|    not an *IntFlag*::
 | |
| 
 | |
|         >>> Color.RED + 2
 | |
|         3
 | |
| 
 | |
|    If a :class:`Flag` operation is performed with an *IntFlag* member and:
 | |
| 
 | |
|    * the result is a valid *IntFlag*: an *IntFlag* is returned
 | |
|    * the result is not a valid *IntFlag*: the result depends on the :class:`FlagBoundary` setting
 | |
| 
 | |
|    The :func:`repr()` of unnamed zero-valued flags has changed.  It is now:
 | |
| 
 | |
|       >>> Color(0)
 | |
|       <Color: 0>
 | |
| 
 | |
|    .. note::
 | |
| 
 | |
|       Using :class:`auto` with :class:`IntFlag` results in integers that are powers
 | |
|       of two, starting with ``1``.
 | |
| 
 | |
|    .. versionchanged:: 3.11
 | |
| 
 | |
|       :meth:`~object.__str__` is now :meth:`!int.__str__` to better support the
 | |
|       *replacement of existing constants* use-case.  :meth:`~object.__format__` was
 | |
|       already :meth:`!int.__format__` for that same reason.
 | |
| 
 | |
|       Inversion of an :class:`!IntFlag` now returns a positive value that is the
 | |
|       union of all flags not in the given flag, rather than a negative value.
 | |
|       This matches the existing :class:`Flag` behavior.
 | |
| 
 | |
| .. class:: ReprEnum
 | |
| 
 | |
|    :class:`!ReprEnum` uses the :meth:`repr() <Enum.__repr__>` of :class:`Enum`,
 | |
|    but the :class:`str() <str>` of the mixed-in data type:
 | |
| 
 | |
|    * :meth:`!int.__str__` for :class:`IntEnum` and :class:`IntFlag`
 | |
|    * :meth:`!str.__str__` for :class:`StrEnum`
 | |
| 
 | |
|    Inherit from :class:`!ReprEnum` to keep the :class:`str() <str>` / :func:`format`
 | |
|    of the mixed-in data type instead of using the
 | |
|    :class:`Enum`-default :meth:`str() <Enum.__str__>`.
 | |
| 
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
| .. class:: EnumCheck
 | |
| 
 | |
|    *EnumCheck* contains the options used by the :func:`verify` decorator to ensure
 | |
|    various constraints; failed constraints result in a :exc:`ValueError`.
 | |
| 
 | |
|    .. attribute:: UNIQUE
 | |
| 
 | |
|       Ensure that each value has only one name::
 | |
| 
 | |
|          >>> from enum import Enum, verify, UNIQUE
 | |
|          >>> @verify(UNIQUE)
 | |
|          ... class Color(Enum):
 | |
|          ...     RED = 1
 | |
|          ...     GREEN = 2
 | |
|          ...     BLUE = 3
 | |
|          ...     CRIMSON = 1
 | |
|          Traceback (most recent call last):
 | |
|          ...
 | |
|          ValueError: aliases found in <enum 'Color'>: CRIMSON -> RED
 | |
| 
 | |
| 
 | |
|    .. attribute:: CONTINUOUS
 | |
| 
 | |
|       Ensure that there are no missing values between the lowest-valued member
 | |
|       and the highest-valued member::
 | |
| 
 | |
|          >>> from enum import Enum, verify, CONTINUOUS
 | |
|          >>> @verify(CONTINUOUS)
 | |
|          ... class Color(Enum):
 | |
|          ...     RED = 1
 | |
|          ...     GREEN = 2
 | |
|          ...     BLUE = 5
 | |
|          Traceback (most recent call last):
 | |
|          ...
 | |
|          ValueError: invalid enum 'Color': missing values 3, 4
 | |
| 
 | |
|    .. attribute:: NAMED_FLAGS
 | |
| 
 | |
|       Ensure that any flag groups/masks contain only named flags -- useful when
 | |
|       values are specified instead of being generated by :func:`auto`::
 | |
| 
 | |
|          >>> from enum import Flag, verify, NAMED_FLAGS
 | |
|          >>> @verify(NAMED_FLAGS)
 | |
|          ... class Color(Flag):
 | |
|          ...     RED = 1
 | |
|          ...     GREEN = 2
 | |
|          ...     BLUE = 4
 | |
|          ...     WHITE = 15
 | |
|          ...     NEON = 31
 | |
|          Traceback (most recent call last):
 | |
|          ...
 | |
|          ValueError: invalid Flag 'Color': aliases WHITE and NEON are missing combined values of 0x18 [use enum.show_flag_values(value) for details]
 | |
| 
 | |
|    .. note::
 | |
| 
 | |
|       CONTINUOUS and NAMED_FLAGS are designed to work with integer-valued members.
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
| .. class:: FlagBoundary
 | |
| 
 | |
|    ``FlagBoundary`` controls how out-of-range values are handled in :class:`Flag` and its
 | |
|    subclasses.
 | |
| 
 | |
|    .. attribute:: STRICT
 | |
| 
 | |
|       Out-of-range values cause a :exc:`ValueError` to be raised. This is the
 | |
|       default for :class:`Flag`::
 | |
| 
 | |
|          >>> from enum import Flag, STRICT, auto
 | |
|          >>> class StrictFlag(Flag, boundary=STRICT):
 | |
|          ...     RED = auto()
 | |
|          ...     GREEN = auto()
 | |
|          ...     BLUE = auto()
 | |
|          ...
 | |
|          >>> StrictFlag(2**2 + 2**4)
 | |
|          Traceback (most recent call last):
 | |
|          ...
 | |
|          ValueError: <flag 'StrictFlag'> invalid value 20
 | |
|              given 0b0 10100
 | |
|            allowed 0b0 00111
 | |
| 
 | |
|    .. attribute:: CONFORM
 | |
| 
 | |
|       Out-of-range values have invalid values removed, leaving a valid :class:`Flag`
 | |
|       value::
 | |
| 
 | |
|          >>> from enum import Flag, CONFORM, auto
 | |
|          >>> class ConformFlag(Flag, boundary=CONFORM):
 | |
|          ...     RED = auto()
 | |
|          ...     GREEN = auto()
 | |
|          ...     BLUE = auto()
 | |
|          ...
 | |
|          >>> ConformFlag(2**2 + 2**4)
 | |
|          <ConformFlag.BLUE: 4>
 | |
| 
 | |
|    .. attribute:: EJECT
 | |
| 
 | |
|       Out-of-range values lose their :class:`Flag` membership and revert to :class:`int`.
 | |
| 
 | |
|          >>> from enum import Flag, EJECT, auto
 | |
|          >>> class EjectFlag(Flag, boundary=EJECT):
 | |
|          ...     RED = auto()
 | |
|          ...     GREEN = auto()
 | |
|          ...     BLUE = auto()
 | |
|          ...
 | |
|          >>> EjectFlag(2**2 + 2**4)
 | |
|          20
 | |
| 
 | |
|    .. attribute:: KEEP
 | |
| 
 | |
|       Out-of-range values are kept, and the :class:`Flag` membership is kept.
 | |
|       This is the default for :class:`IntFlag`::
 | |
| 
 | |
|          >>> from enum import Flag, KEEP, auto
 | |
|          >>> class KeepFlag(Flag, boundary=KEEP):
 | |
|          ...     RED = auto()
 | |
|          ...     GREEN = auto()
 | |
|          ...     BLUE = auto()
 | |
|          ...
 | |
|          >>> KeepFlag(2**2 + 2**4)
 | |
|          <KeepFlag.BLUE|16: 20>
 | |
| 
 | |
| .. versionadded:: 3.11
 | |
| 
 | |
| ---------------
 | |
| 
 | |
| Supported ``__dunder__`` names
 | |
| """"""""""""""""""""""""""""""
 | |
| 
 | |
| :attr:`~EnumType.__members__` is a read-only ordered mapping of ``member_name``:``member``
 | |
| items.  It is only available on the class.
 | |
| 
 | |
| :meth:`~Enum.__new__`, if specified, must create and return the enum members;
 | |
| it is also a very good idea to set the member's :attr:`!_value_` appropriately.
 | |
| Once all the members are created it is no longer used.
 | |
| 
 | |
| 
 | |
| Supported ``_sunder_`` names
 | |
| """"""""""""""""""""""""""""
 | |
| 
 | |
| - :meth:`~EnumType._add_alias_` -- adds a new name as an alias to an existing
 | |
|   member.
 | |
| - :meth:`~EnumType._add_value_alias_` -- adds a new value as an alias to an
 | |
|   existing member.
 | |
| - :attr:`~Enum._name_` -- name of the member
 | |
| - :attr:`~Enum._value_` -- value of the member; can be set in ``__new__``
 | |
| - :meth:`~Enum._missing_` -- a lookup function used when a value is not found;
 | |
|   may be overridden
 | |
| - :attr:`~Enum._ignore_` -- a list of names, either as a :class:`list` or a
 | |
|   :class:`str`, that will not be transformed into members, and will be removed
 | |
|   from the final class
 | |
| - :attr:`~Enum._order_` -- no longer used, kept for backward
 | |
|   compatibility (class attribute, removed during class creation)
 | |
| - :meth:`~Enum._generate_next_value_` -- used to get an appropriate value for
 | |
|   an enum member; may be overridden
 | |
| 
 | |
|   .. note::
 | |
| 
 | |
|      For standard :class:`Enum` classes the next value chosen is the highest
 | |
|      value seen incremented by one.
 | |
| 
 | |
|      For :class:`Flag` classes the next value chosen will be the next highest
 | |
|      power-of-two.
 | |
| 
 | |
| - While ``_sunder_`` names are generally reserved for the further development
 | |
|   of the :class:`Enum` class and can not be used, some are explicitly allowed:
 | |
| 
 | |
|   - ``_repr_*`` (e.g. ``_repr_html_``), as used in `IPython's rich display`_
 | |
| 
 | |
| .. versionadded:: 3.6 ``_missing_``, ``_order_``, ``_generate_next_value_``
 | |
| .. versionadded:: 3.7 ``_ignore_``
 | |
| .. versionadded:: 3.13 ``_add_alias_``, ``_add_value_alias_``, ``_repr_*``
 | |
| .. _`IPython's rich display`: https://ipython.readthedocs.io/en/stable/config/integrating.html#rich-display
 | |
| 
 | |
| ---------------
 | |
| 
 | |
| Utilities and Decorators
 | |
| ------------------------
 | |
| 
 | |
| .. class:: auto
 | |
| 
 | |
|    *auto* can be used in place of a value.  If used, the *Enum* machinery will
 | |
|    call an :class:`Enum`'s :meth:`~Enum._generate_next_value_` to get an appropriate value.
 | |
|    For :class:`Enum` and :class:`IntEnum` that appropriate value will be the last value plus
 | |
|    one; for :class:`Flag` and :class:`IntFlag` it will be the first power-of-two greater
 | |
|    than the highest value; for :class:`StrEnum` it will be the lower-cased version of
 | |
|    the member's name.  Care must be taken if mixing *auto()* with manually
 | |
|    specified values.
 | |
| 
 | |
|    *auto* instances are only resolved when at the top level of an assignment:
 | |
| 
 | |
|    * ``FIRST = auto()`` will work (auto() is replaced with ``1``);
 | |
|    * ``SECOND = auto(), -2`` will work (auto is replaced with ``2``, so ``2, -2`` is
 | |
|      used to create the ``SECOND`` enum member;
 | |
|    * ``THREE = [auto(), -3]`` will *not* work (``<auto instance>, -3`` is used to
 | |
|      create the ``THREE`` enum member)
 | |
| 
 | |
|    .. versionchanged:: 3.11.1
 | |
| 
 | |
|       In prior versions, ``auto()`` had to be the only thing
 | |
|       on the assignment line to work properly.
 | |
| 
 | |
|    ``_generate_next_value_`` can be overridden to customize the values used by
 | |
|    *auto*.
 | |
| 
 | |
|    .. note:: in 3.13 the default ``_generate_next_value_`` will always return
 | |
|              the highest member value incremented by 1, and will fail if any
 | |
|              member is an incompatible type.
 | |
| 
 | |
| .. decorator:: property
 | |
| 
 | |
|    A decorator similar to the built-in *property*, but specifically for
 | |
|    enumerations.  It allows member attributes to have the same names as members
 | |
|    themselves.
 | |
| 
 | |
|    .. note:: the *property* and the member must be defined in separate classes;
 | |
|              for example, the *value* and *name* attributes are defined in the
 | |
|              *Enum* class, and *Enum* subclasses can define members with the
 | |
|              names ``value`` and ``name``.
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
| .. decorator:: unique
 | |
| 
 | |
|    A :keyword:`class` decorator specifically for enumerations.  It searches an
 | |
|    enumeration's :attr:`~EnumType.__members__`, gathering any aliases it finds; if any are
 | |
|    found :exc:`ValueError` is raised with the details::
 | |
| 
 | |
|       >>> from enum import Enum, unique
 | |
|       >>> @unique
 | |
|       ... class Mistake(Enum):
 | |
|       ...     ONE = 1
 | |
|       ...     TWO = 2
 | |
|       ...     THREE = 3
 | |
|       ...     FOUR = 3
 | |
|       ...
 | |
|       Traceback (most recent call last):
 | |
|       ...
 | |
|       ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
 | |
| 
 | |
| .. decorator:: verify
 | |
| 
 | |
|    A :keyword:`class` decorator specifically for enumerations.  Members from
 | |
|    :class:`EnumCheck` are used to specify which constraints should be checked
 | |
|    on the decorated enumeration.
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
| .. decorator:: member
 | |
| 
 | |
|    A decorator for use in enums: its target will become a member.
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
| .. decorator:: nonmember
 | |
| 
 | |
|    A decorator for use in enums: its target will not become a member.
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
| .. decorator:: global_enum
 | |
| 
 | |
|    A decorator to change the :class:`str() <str>` and :func:`repr` of an enum
 | |
|    to show its members as belonging to the module instead of its class.
 | |
|    Should only be used when the enum members are exported
 | |
|    to the module global namespace (see :class:`re.RegexFlag` for an example).
 | |
| 
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
| .. function:: show_flag_values(value)
 | |
| 
 | |
|    Return a list of all power-of-two integers contained in a flag *value*.
 | |
| 
 | |
|    .. versionadded:: 3.11
 | |
| 
 | |
| ---------------
 | |
| 
 | |
| Notes
 | |
| -----
 | |
| 
 | |
| :class:`IntEnum`, :class:`StrEnum`, and :class:`IntFlag`
 | |
| 
 | |
|    These three enum types are designed to be drop-in replacements for existing
 | |
|    integer- and string-based values; as such, they have extra limitations:
 | |
| 
 | |
|    - ``__str__`` uses the value and not the name of the enum member
 | |
| 
 | |
|    - ``__format__``, because it uses ``__str__``, will also use the value of
 | |
|      the enum member instead of its name
 | |
| 
 | |
|    If you do not need/want those limitations, you can either create your own
 | |
|    base class by mixing in the ``int`` or ``str`` type yourself::
 | |
| 
 | |
|        >>> from enum import Enum
 | |
|        >>> class MyIntEnum(int, Enum):
 | |
|        ...     pass
 | |
| 
 | |
|    or you can reassign the appropriate :meth:`str`, etc., in your enum::
 | |
| 
 | |
|        >>> from enum import Enum, IntEnum
 | |
|        >>> class MyIntEnum(IntEnum):
 | |
|        ...     __str__ = Enum.__str__
 | 
