Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
946a73e4
Commit
946a73e4
authored
Sep 06, 2013
by
Ethan Furman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Close #18908: Keep Enum docs in their own section. Patch by Elazar Gershuni.
parent
91982420
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
67 additions
and
58 deletions
+67
-58
Doc/library/enum.rst
Doc/library/enum.rst
+67
-58
No files found.
Doc/library/enum.rst
View file @
946a73e4
...
...
@@ -36,11 +36,15 @@ follows::
... red = 1
... green = 2
... blue = 3
...
**A note on nomenclature**: we call :class:`Color` an *enumeration* (or *enum*)
and :attr:`Color.red`, :attr:`Color.green` are *enumeration members* (or
*enum members*). Enumeration members also have *values* (the value of
:attr:`Color.red` is ``1``, etc.)
..note: Nomenclature
- The class :class:`Color` is an *enumeration* (or *enum*)
- The attributes :attr:`Color.red`, :attr:`Color.green`, etc., are
*enumeration members* (or *enum members*).
- The enum members have *names* and *values* (the name of
:attr:`Color.red` is ``red``, the value of :attr:`Color.blue` is
``3``, etc.)
Enumeration members have human readable string representations::
...
...
@@ -68,13 +72,13 @@ Enum members also have a property that contains just their item name::
Enumerations support iteration, in definition order::
>>> class Shake(Enum):
... vanilla = 7
... chocolate = 4
... cookies = 9
... mint = 3
...
vanilla = 7
...
chocolate = 4
...
cookies = 9
...
mint = 3
...
>>> for shake in Shake:
... print(shake)
...
print(shake)
...
Shake.vanilla
Shake.chocolate
...
...
@@ -124,8 +128,8 @@ Duplicating enum members and values
Having two enum members with the same name is invalid::
>>> class Shape(Enum):
... square = 2
... square = 3
...
square = 2
...
square = 3
...
Traceback (most recent call last):
...
...
...
@@ -137,10 +141,10 @@ lookup of the value of A and B will return A. By-name lookup of B will also
return A::
>>> class Shape(Enum):
... square = 2
... diamond = 1
... circle = 3
... alias_for_square = 2
...
square = 2
...
diamond = 1
...
circle = 3
...
alias_for_square = 2
...
>>> Shape.square
<Shape.square: 2>
...
...
@@ -151,7 +155,7 @@ return A::
Ensuring unique enumeration values
==================================
----------------------------------
By default, enumerations allow multiple names as aliases for the same value.
When this behavior isn't desired, the following decorator can be used to
...
...
@@ -166,17 +170,18 @@ 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
... one = 1
... two = 2
... three = 3
... four = 3
...
Traceback (most recent call last):
...
ValueError: duplicate values found in <enum 'Mistake'>: four -> three
Iteration
=========
---------
Iterating over the members of an enum does not provide the aliases::
...
...
@@ -188,7 +193,7 @@ to members. It includes all names defined in the enumeration, including the
aliases::
>>> for name, member in Shape.__members__.items():
... name, member
...
name, member
...
('square', <Shape.square: 2>)
('diamond', <Shape.diamond: 1>)
...
...
@@ -252,20 +257,21 @@ Enumerations are Python classes, and can have methods and special methods as
usual. If we have this enumeration::
>>> class Mood(Enum):
... funky = 1
... happy = 3
... funky = 1
... happy = 3
...
... def describe(self):
... # self is the member here
... return self.name, self.value
...
... def describe(self):
... # self is the member here
... return self.name, self.value
... def __str__(self):
... return 'my custom str! {0}'.format(self.value)
...
... def __str__(self):
... return 'my custom str! {0}'.format(self.value)
... @classmethod
... def favorite_mood(cls):
... # cls here is the enumeration
... return cls.happy
...
... @classmethod
... def favorite_mood(cls):
... # cls here is the enumeration
... return cls.happy
Then::
...
...
@@ -294,7 +300,8 @@ Subclassing an enumeration is allowed only if the enumeration does not define
any members. So this is forbidden::
>>> class MoreColor(Color):
... pink = 17
... pink = 17
...
Traceback (most recent call last):
...
TypeError: Cannot extend enumerations
...
...
@@ -302,12 +309,12 @@ any members. So this is forbidden::
But this is allowed::
>>> class Foo(Enum):
... def some_behavior(self):
... pass
...
def some_behavior(self):
...
pass
...
>>> class Bar(Foo):
... happy = 1
... sad = 2
...
happy = 1
...
sad = 2
...
Allowing subclassing of enums that define members would lead to a violation of
...
...
@@ -363,10 +370,11 @@ new class derived from :class:`Enum` is returned. In other words, the above
assignment to :class:`Animal` is equivalent to::
>>> class Animals(Enum):
... ant = 1
... bee = 2
... cat = 3
... dog = 4
... ant = 1
... bee = 2
... cat = 3
... dog = 4
...
The reason for defaulting to ``1`` as the starting number and not ``0`` is
that ``0`` is ``False`` in a boolean sense, but enum members all evaluate
...
...
@@ -381,10 +389,10 @@ The solution is to specify the module name explicitly as follows::
>>> Animals = Enum('Animals', 'ant bee cat dog', module=__name__)
Derived Enumerations
====================
--------------------
IntEnum
-------
^^^^^^^
A variation of :class:`Enum` is provided which is also a subclass of
:class:`int`. Members of an :class:`IntEnum` can be compared to integers;
...
...
@@ -393,12 +401,12 @@ to each other::
>>> from enum import IntEnum
>>> class Shape(IntEnum):
... circle = 1
... square = 2
...
circle = 1
...
square = 2
...
>>> class Request(IntEnum):
... post = 1
... get = 2
...
post = 1
...
get = 2
...
>>> Shape == 1
False
...
...
@@ -410,12 +418,12 @@ to each other::
However, they still can't be compared to standard :class:`Enum` enumerations::
>>> class Shape(IntEnum):
... circle = 1
... square = 2
...
circle = 1
...
square = 2
...
>>> class Color(Enum):
... red = 1
... green = 2
...
red = 1
...
green = 2
...
>>> Shape.circle == Color.red
False
...
...
@@ -439,7 +447,7 @@ that still expects integers.
Others
------
^^^^^^
While :class:`IntEnum` is part of the :mod:`enum` module, it would be very
simple to implement independently::
...
...
@@ -472,7 +480,7 @@ Some rules:
Interesting examples
====================
--------------------
While :class:`Enum` and :class:`IntEnum` are expected to cover the majority of
use-cases, they cannot cover them all. Here are recipes for some different
...
...
@@ -481,7 +489,7 @@ one's own.
AutoNumber
----------
^^^^^^^^^^
Avoids having to specify the value for each enumeration member::
...
...
@@ -502,7 +510,7 @@ Avoids having to specify the value for each enumeration member::
OrderedEnum
-----------
^^^^^^^^^^^
An ordered enumeration that is not based on :class:`IntEnum` and so maintains
the normal :class:`Enum` invariants (such as not being comparable to other
...
...
@@ -538,7 +546,7 @@ enumerations)::
DuplicateFreeEnum
-----------------
^^^^^^^^^^^^^^^^^
Raises an error if a duplicate member name is found instead of creating an
alias::
...
...
@@ -558,6 +566,7 @@ alias::
... green = 2
... blue = 3
... grene = 2
...
Traceback (most recent call last):
...
ValueError: aliases not allowed in DuplicateFreeEnum: 'grene' --> 'green'
...
...
@@ -570,7 +579,7 @@ alias::
Planet
------
^^^^^^
If :meth:`__new__` or :meth:`__init__` is defined the value of the enum member
will be passed to those methods::
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment