@@ -18,7 +18,10 @@ values. Within an enumeration, the members can be compared by identity, and
1818the enumeration itself can be iterated over.
1919
2020This module defines two enumeration classes that can be used to define unique
21- sets of names and values: :class: `Enum ` and :class: `IntEnum `.
21+ sets of names and values: :class: `Enum ` and :class: `IntEnum `. It also defines
22+ one decorator, :func: `unique `, that ensures only unique member values are
23+ present in an enumeration.
24+
2225
2326Creating an Enum
2427----------------
@@ -146,6 +149,35 @@ return A::
146149 >>> Shape(2)
147150 <Shape.square: 2>
148151
152+
153+ Ensuring unique enumeration values
154+ ==================================
155+
156+ By default, enumerations allow multiple names as aliases for the same value.
157+ When this behavior isn't desired, the following decorator can be used to
158+ ensure each value is used only once in the enumeration:
159+
160+ .. decorator :: unique
161+
162+ A :keyword: `class ` decorator specifically for enumerations. It searches an
163+ enumeration's :attr: `__members__ ` gathering any aliases it finds; if any are
164+ found :exc: `ValueError ` is raised with the details::
165+
166+ >>> from enum import Enum, unique
167+ >>> @unique
168+ ... class Mistake(Enum):
169+ ... one = 1
170+ ... two = 2
171+ ... three = 3
172+ ... four = 3
173+ Traceback (most recent call last):
174+ ...
175+ ValueError: duplicate values found in <enum 'Mistake'>: four -> three
176+
177+
178+ Iteration
179+ =========
180+
149181Iterating over the members of an enum does not provide the aliases::
150182
151183 >>> list(Shape)
@@ -169,6 +201,7 @@ the enumeration members. For example, finding all the aliases::
169201 >>> [name for name, member in Shape.__members__.items() if member.name != name]
170202 ['alias_for_square']
171203
204+
172205Comparisons
173206-----------
174207
@@ -462,32 +495,6 @@ Avoids having to specify the value for each enumeration member::
462495 True
463496
464497
465- UniqueEnum
466- ----------
467-
468- Raises an error if a duplicate member name is found instead of creating an
469- alias::
470-
471- >>> class UniqueEnum(Enum):
472- ... def __init__(self, *args):
473- ... cls = self.__class__
474- ... if any(self.value == e.value for e in cls):
475- ... a = self.name
476- ... e = cls(self.value).name
477- ... raise ValueError(
478- ... "aliases not allowed in UniqueEnum: %r --> %r"
479- ... % (a, e))
480- ...
481- >>> class Color(UniqueEnum):
482- ... red = 1
483- ... green = 2
484- ... blue = 3
485- ... grene = 2
486- Traceback (most recent call last):
487- ...
488- ValueError: aliases not allowed in UniqueEnum: 'grene' --> 'green'
489-
490-
491498OrderedEnum
492499-----------
493500
@@ -524,6 +531,38 @@ enumerations)::
524531 True
525532
526533
534+ DuplicateFreeEnum
535+ -----------------
536+
537+ Raises an error if a duplicate member name is found instead of creating an
538+ alias::
539+
540+ >>> class DuplicateFreeEnum(Enum):
541+ ... def __init__(self, *args):
542+ ... cls = self.__class__
543+ ... if any(self.value == e.value for e in cls):
544+ ... a = self.name
545+ ... e = cls(self.value).name
546+ ... raise ValueError(
547+ ... "aliases not allowed in DuplicateFreeEnum: %r --> %r"
548+ ... % (a, e))
549+ ...
550+ >>> class Color(DuplicateFreeEnum):
551+ ... red = 1
552+ ... green = 2
553+ ... blue = 3
554+ ... grene = 2
555+ Traceback (most recent call last):
556+ ...
557+ ValueError: aliases not allowed in DuplicateFreeEnum: 'grene' --> 'green'
558+
559+ .. note ::
560+
561+ This is a useful example for subclassing Enum to add or change other
562+ behaviors as well as disallowing aliases. If the only change desired is
563+ no aliases allowed the :func: `unique ` decorator can be used instead.
564+
565+
527566Planet
528567------
529568
0 commit comments