Commit 9cf46bda authored by Ethan Furman's avatar Ethan Furman

close issue28172: Change all example enum member names to uppercase, per...

close issue28172: Change all example enum member names to uppercase, per Guido; patch by Chris Angelico.
parent ef8ba6c8
...@@ -70,9 +70,9 @@ follows:: ...@@ -70,9 +70,9 @@ follows::
>>> from enum import Enum >>> from enum import Enum
>>> class Color(Enum): >>> class Color(Enum):
... red = 1 ... RED = 1
... green = 2 ... GREEN = 2
... blue = 3 ... BLUE = 3
... ...
.. note:: Enum member values .. note:: Enum member values
...@@ -85,10 +85,10 @@ follows:: ...@@ -85,10 +85,10 @@ follows::
.. note:: Nomenclature .. note:: Nomenclature
- The class :class:`Color` is an *enumeration* (or *enum*) - The class :class:`Color` is an *enumeration* (or *enum*)
- The attributes :attr:`Color.red`, :attr:`Color.green`, etc., are - The attributes :attr:`Color.RED`, :attr:`Color.GREEN`, etc., are
*enumeration members* (or *enum members*). *enumeration members* (or *enum members*) and are functionally constants.
- The enum members have *names* and *values* (the name of - The enum members have *names* and *values* (the name of
:attr:`Color.red` is ``red``, the value of :attr:`Color.blue` is :attr:`Color.RED` is ``RED``, the value of :attr:`Color.BLUE` is
``3``, etc.) ``3``, etc.)
.. note:: .. note::
...@@ -99,49 +99,49 @@ follows:: ...@@ -99,49 +99,49 @@ follows::
Enumeration members have human readable string representations:: Enumeration members have human readable string representations::
>>> print(Color.red) >>> print(Color.RED)
Color.red Color.RED
...while their ``repr`` has more information:: ...while their ``repr`` has more information::
>>> print(repr(Color.red)) >>> print(repr(Color.RED))
<Color.red: 1> <Color.RED: 1>
The *type* of an enumeration member is the enumeration it belongs to:: The *type* of an enumeration member is the enumeration it belongs to::
>>> type(Color.red) >>> type(Color.RED)
<enum 'Color'> <enum 'Color'>
>>> isinstance(Color.green, Color) >>> isinstance(Color.GREEN, Color)
True True
>>> >>>
Enum members also have a property that contains just their item name:: Enum members also have a property that contains just their item name::
>>> print(Color.red.name) >>> print(Color.RED.name)
red RED
Enumerations support iteration, in definition order:: Enumerations support iteration, in definition order::
>>> class Shake(Enum): >>> class Shake(Enum):
... vanilla = 7 ... VANILLA = 7
... chocolate = 4 ... CHOCOLATE = 4
... cookies = 9 ... COOKIES = 9
... mint = 3 ... MINT = 3
... ...
>>> for shake in Shake: >>> for shake in Shake:
... print(shake) ... print(shake)
... ...
Shake.vanilla Shake.VANILLA
Shake.chocolate Shake.CHOCOLATE
Shake.cookies Shake.COOKIES
Shake.mint Shake.MINT
Enumeration members are hashable, so they can be used in dictionaries and sets:: Enumeration members are hashable, so they can be used in dictionaries and sets::
>>> apples = {} >>> apples = {}
>>> apples[Color.red] = 'red delicious' >>> apples[Color.RED] = 'red delicious'
>>> apples[Color.green] = 'granny smith' >>> apples[Color.GREEN] = 'granny smith'
>>> apples == {Color.red: 'red delicious', Color.green: 'granny smith'} >>> apples == {Color.RED: 'red delicious', Color.GREEN: 'granny smith'}
True True
...@@ -149,26 +149,26 @@ Programmatic access to enumeration members and their attributes ...@@ -149,26 +149,26 @@ Programmatic access to enumeration members and their attributes
--------------------------------------------------------------- ---------------------------------------------------------------
Sometimes it's useful to access members in enumerations programmatically (i.e. Sometimes it's useful to access members in enumerations programmatically (i.e.
situations where ``Color.red`` won't do because the exact color is not known situations where ``Color.RED`` won't do because the exact color is not known
at program-writing time). ``Enum`` allows such access:: at program-writing time). ``Enum`` allows such access::
>>> Color(1) >>> Color(1)
<Color.red: 1> <Color.RED: 1>
>>> Color(3) >>> Color(3)
<Color.blue: 3> <Color.BLUE: 3>
If you want to access enum members by *name*, use item access:: If you want to access enum members by *name*, use item access::
>>> Color['red'] >>> Color['RED']
<Color.red: 1> <Color.RED: 1>
>>> Color['green'] >>> Color['GREEN']
<Color.green: 2> <Color.GREEN: 2>
If you have an enum member and need its :attr:`name` or :attr:`value`:: If you have an enum member and need its :attr:`name` or :attr:`value`::
>>> member = Color.red >>> member = Color.RED
>>> member.name >>> member.name
'red' 'RED'
>>> member.value >>> member.value
1 1
...@@ -179,12 +179,12 @@ Duplicating enum members and values ...@@ -179,12 +179,12 @@ Duplicating enum members and values
Having two enum members with the same name is invalid:: Having two enum members with the same name is invalid::
>>> class Shape(Enum): >>> class Shape(Enum):
... square = 2 ... SQUARE = 2
... square = 3 ... SQUARE = 3
... ...
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Attempted to reuse key: 'square' TypeError: Attempted to reuse key: 'SQUARE'
However, two enum members are allowed to have the same value. Given two members However, two enum members are allowed to have the same value. Given two members
A and B with the same value (and A defined first), B is an alias to A. By-value A and B with the same value (and A defined first), B is an alias to A. By-value
...@@ -192,17 +192,17 @@ lookup of the value of A and B will return A. By-name lookup of B will also ...@@ -192,17 +192,17 @@ lookup of the value of A and B will return A. By-name lookup of B will also
return A:: return A::
>>> class Shape(Enum): >>> class Shape(Enum):
... square = 2 ... SQUARE = 2
... diamond = 1 ... DIAMOND = 1
... circle = 3 ... CIRCLE = 3
... alias_for_square = 2 ... ALIAS_FOR_SQUARE = 2
... ...
>>> Shape.square >>> Shape.SQUARE
<Shape.square: 2> <Shape.SQUARE: 2>
>>> Shape.alias_for_square >>> Shape.ALIAS_FOR_SQUARE
<Shape.square: 2> <Shape.SQUARE: 2>
>>> Shape(2) >>> Shape(2)
<Shape.square: 2> <Shape.SQUARE: 2>
.. note:: .. note::
...@@ -227,14 +227,14 @@ found :exc:`ValueError` is raised with the details:: ...@@ -227,14 +227,14 @@ found :exc:`ValueError` is raised with the details::
>>> from enum import Enum, unique >>> from enum import Enum, unique
>>> @unique >>> @unique
... class Mistake(Enum): ... class Mistake(Enum):
... one = 1 ... ONE = 1
... two = 2 ... TWO = 2
... three = 3 ... THREE = 3
... four = 3 ... FOUR = 3
... ...
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: duplicate values found in <enum 'Mistake'>: four -> three ValueError: duplicate values found in <enum 'Mistake'>: FOUR -> THREE
Using automatic values Using automatic values
...@@ -244,12 +244,12 @@ If the exact value is unimportant you can use :class:`auto`:: ...@@ -244,12 +244,12 @@ If the exact value is unimportant you can use :class:`auto`::
>>> from enum import Enum, auto >>> from enum import Enum, auto
>>> class Color(Enum): >>> class Color(Enum):
... red = auto() ... RED = auto()
... blue = auto() ... BLUE = auto()
... green = auto() ... GREEN = auto()
... ...
>>> list(Color) >>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>] [<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]
The values are chosen by :func:`_generate_next_value_`, which can be The values are chosen by :func:`_generate_next_value_`, which can be
overridden:: overridden::
...@@ -259,13 +259,13 @@ overridden:: ...@@ -259,13 +259,13 @@ overridden::
... return name ... return name
... ...
>>> class Ordinal(AutoName): >>> class Ordinal(AutoName):
... north = auto() ... NORTH = auto()
... south = auto() ... SOUTH = auto()
... east = auto() ... EAST = auto()
... west = auto() ... WEST = auto()
... ...
>>> list(Ordinal) >>> list(Ordinal)
[<Ordinal.north: 'north'>, <Ordinal.south: 'south'>, <Ordinal.east: 'east'>, <Ordinal.west: 'west'>] [<Ordinal.NORTH: 'NORTH'>, <Ordinal.SOUTH: 'SOUTH'>, <Ordinal.EAST: 'EAST'>, <Ordinal.WEST: 'WEST'>]
.. note:: .. note::
...@@ -279,7 +279,7 @@ Iteration ...@@ -279,7 +279,7 @@ Iteration
Iterating over the members of an enum does not provide the aliases:: Iterating over the members of an enum does not provide the aliases::
>>> list(Shape) >>> list(Shape)
[<Shape.square: 2>, <Shape.diamond: 1>, <Shape.circle: 3>] [<Shape.SQUARE: 2>, <Shape.DIAMOND: 1>, <Shape.CIRCLE: 3>]
The special attribute ``__members__`` is an ordered dictionary mapping names The special attribute ``__members__`` is an ordered dictionary mapping names
to members. It includes all names defined in the enumeration, including the to members. It includes all names defined in the enumeration, including the
...@@ -288,16 +288,16 @@ aliases:: ...@@ -288,16 +288,16 @@ aliases::
>>> for name, member in Shape.__members__.items(): >>> for name, member in Shape.__members__.items():
... name, member ... name, member
... ...
('square', <Shape.square: 2>) ('SQUARE', <Shape.SQUARE: 2>)
('diamond', <Shape.diamond: 1>) ('DIAMOND', <Shape.DIAMOND: 1>)
('circle', <Shape.circle: 3>) ('CIRCLE', <Shape.CIRCLE: 3>)
('alias_for_square', <Shape.square: 2>) ('ALIAS_FOR_SQUARE', <Shape.SQUARE: 2>)
The ``__members__`` attribute can be used for detailed programmatic access to The ``__members__`` attribute can be used for detailed programmatic access to
the enumeration members. For example, finding all the aliases:: the enumeration members. For example, finding all the aliases::
>>> [name for name, member in Shape.__members__.items() if member.name != name] >>> [name for name, member in Shape.__members__.items() if member.name != name]
['alias_for_square'] ['ALIAS_FOR_SQUARE']
Comparisons Comparisons
...@@ -305,35 +305,35 @@ Comparisons ...@@ -305,35 +305,35 @@ Comparisons
Enumeration members are compared by identity:: Enumeration members are compared by identity::
>>> Color.red is Color.red >>> Color.RED is Color.RED
True True
>>> Color.red is Color.blue >>> Color.RED is Color.BLUE
False False
>>> Color.red is not Color.blue >>> Color.RED is not Color.BLUE
True True
Ordered comparisons between enumeration values are *not* supported. Enum Ordered comparisons between enumeration values are *not* supported. Enum
members are not integers (but see `IntEnum`_ below):: members are not integers (but see `IntEnum`_ below)::
>>> Color.red < Color.blue >>> Color.RED < Color.BLUE
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in <module> File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'Color' and 'Color' TypeError: '<' not supported between instances of 'Color' and 'Color'
Equality comparisons are defined though:: Equality comparisons are defined though::
>>> Color.blue == Color.red >>> Color.BLUE == Color.RED
False False
>>> Color.blue != Color.red >>> Color.BLUE != Color.RED
True True
>>> Color.blue == Color.blue >>> Color.BLUE == Color.BLUE
True True
Comparisons against non-enumeration values will always compare not equal Comparisons against non-enumeration values will always compare not equal
(again, :class:`IntEnum` was explicitly designed to behave differently, see (again, :class:`IntEnum` was explicitly designed to behave differently, see
below):: below)::
>>> Color.blue == 2 >>> Color.BLUE == 2
False False
...@@ -350,8 +350,8 @@ Enumerations are Python classes, and can have methods and special methods as ...@@ -350,8 +350,8 @@ Enumerations are Python classes, and can have methods and special methods as
usual. If we have this enumeration:: usual. If we have this enumeration::
>>> class Mood(Enum): >>> class Mood(Enum):
... funky = 1 ... FUNKY = 1
... happy = 3 ... HAPPY = 3
... ...
... def describe(self): ... def describe(self):
... # self is the member here ... # self is the member here
...@@ -363,16 +363,16 @@ usual. If we have this enumeration:: ...@@ -363,16 +363,16 @@ usual. If we have this enumeration::
... @classmethod ... @classmethod
... def favorite_mood(cls): ... def favorite_mood(cls):
... # cls here is the enumeration ... # cls here is the enumeration
... return cls.happy ... return cls.HAPPY
... ...
Then:: Then::
>>> Mood.favorite_mood() >>> Mood.favorite_mood()
<Mood.happy: 3> <Mood.HAPPY: 3>
>>> Mood.happy.describe() >>> Mood.HAPPY.describe()
('happy', 3) ('HAPPY', 3)
>>> str(Mood.funky) >>> str(Mood.FUNKY)
'my custom str! 1' 'my custom str! 1'
The rules for what is allowed are as follows: names that start and end with The rules for what is allowed are as follows: names that start and end with
...@@ -393,7 +393,7 @@ Subclassing an enumeration is allowed only if the enumeration does not define ...@@ -393,7 +393,7 @@ Subclassing an enumeration is allowed only if the enumeration does not define
any members. So this is forbidden:: any members. So this is forbidden::
>>> class MoreColor(Color): >>> class MoreColor(Color):
... pink = 17 ... PINK = 17
... ...
Traceback (most recent call last): Traceback (most recent call last):
... ...
...@@ -406,8 +406,8 @@ But this is allowed:: ...@@ -406,8 +406,8 @@ But this is allowed::
... pass ... pass
... ...
>>> class Bar(Foo): >>> class Bar(Foo):
... happy = 1 ... HAPPY = 1
... sad = 2 ... SAD = 2
... ...
Allowing subclassing of enums that define members would lead to a violation of Allowing subclassing of enums that define members would lead to a violation of
...@@ -423,7 +423,7 @@ Enumerations can be pickled and unpickled:: ...@@ -423,7 +423,7 @@ Enumerations can be pickled and unpickled::
>>> from test.test_enum import Fruit >>> from test.test_enum import Fruit
>>> from pickle import dumps, loads >>> from pickle import dumps, loads
>>> Fruit.tomato is loads(dumps(Fruit.tomato)) >>> Fruit.TOMATO is loads(dumps(Fruit.TOMATO))
True True
The usual restrictions for pickling apply: picklable enums must be defined in The usual restrictions for pickling apply: picklable enums must be defined in
...@@ -444,15 +444,15 @@ Functional API ...@@ -444,15 +444,15 @@ Functional API
The :class:`Enum` class is callable, providing the following functional API:: The :class:`Enum` class is callable, providing the following functional API::
>>> Animal = Enum('Animal', 'ant bee cat dog') >>> Animal = Enum('Animal', 'ANT BEE CAT DOG')
>>> Animal >>> Animal
<enum 'Animal'> <enum 'Animal'>
>>> Animal.ant >>> Animal.ANT
<Animal.ant: 1> <Animal.ANT: 1>
>>> Animal.ant.value >>> Animal.ANT.value
1 1
>>> list(Animal) >>> list(Animal)
[<Animal.ant: 1>, <Animal.bee: 2>, <Animal.cat: 3>, <Animal.dog: 4>] [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
The semantics of this API resemble :class:`~collections.namedtuple`. The first The semantics of this API resemble :class:`~collections.namedtuple`. The first
argument of the call to :class:`Enum` is the name of the enumeration. argument of the call to :class:`Enum` is the name of the enumeration.
...@@ -467,10 +467,10 @@ new class derived from :class:`Enum` is returned. In other words, the above ...@@ -467,10 +467,10 @@ new class derived from :class:`Enum` is returned. In other words, the above
assignment to :class:`Animal` is equivalent to:: assignment to :class:`Animal` is equivalent to::
>>> class Animal(Enum): >>> class Animal(Enum):
... ant = 1 ... ANT = 1
... bee = 2 ... BEE = 2
... cat = 3 ... CAT = 3
... dog = 4 ... DOG = 4
... ...
The reason for defaulting to ``1`` as the starting number and not ``0`` is The reason for defaulting to ``1`` as the starting number and not ``0`` is
...@@ -483,7 +483,7 @@ enumeration is being created in (e.g. it will fail if you use a utility ...@@ -483,7 +483,7 @@ enumeration is being created in (e.g. it will fail if you use a utility
function in separate module, and also may not work on IronPython or Jython). function in separate module, and also may not work on IronPython or Jython).
The solution is to specify the module name explicitly as follows:: The solution is to specify the module name explicitly as follows::
>>> Animal = Enum('Animal', 'ant bee cat dog', module=__name__) >>> Animal = Enum('Animal', 'ANT BEE CAT DOG', module=__name__)
.. warning:: .. warning::
...@@ -496,7 +496,7 @@ The new pickle protocol 4 also, in some circumstances, relies on ...@@ -496,7 +496,7 @@ The new pickle protocol 4 also, in some circumstances, relies on
to find the class. For example, if the class was made available in class to find the class. For example, if the class was made available in class
SomeData in the global scope:: SomeData in the global scope::
>>> Animal = Enum('Animal', 'ant bee cat dog', qualname='SomeData.Animal') >>> Animal = Enum('Animal', 'ANT BEE CAT DOG', qualname='SomeData.Animal')
The complete signature is:: The complete signature is::
...@@ -507,19 +507,19 @@ The complete signature is:: ...@@ -507,19 +507,19 @@ The complete signature is::
:names: The Enum members. This can be a whitespace or comma separated string :names: The Enum members. This can be a whitespace or comma separated string
(values will start at 1 unless otherwise specified):: (values will start at 1 unless otherwise specified)::
'red green blue' | 'red,green,blue' | 'red, green, blue' 'RED GREEN BLUE' | 'RED,GREEN,BLUE' | 'RED, GREEN, BLUE'
or an iterator of names:: or an iterator of names::
['red', 'green', 'blue'] ['RED', 'GREEN', 'BLUE']
or an iterator of (name, value) pairs:: or an iterator of (name, value) pairs::
[('cyan', 4), ('magenta', 5), ('yellow', 6)] [('CYAN', 4), ('MAGENTA', 5), ('YELLOW', 6)]
or a mapping:: or a mapping::
{'chartreuse': 7, 'sea_green': 11, 'rosemary': 42} {'CHARTREUSE': 7, 'SEA_GREEN': 11, 'ROSEMARY': 42}
:module: name of module where new Enum class can be found. :module: name of module where new Enum class can be found.
...@@ -546,40 +546,40 @@ to each other:: ...@@ -546,40 +546,40 @@ to each other::
>>> from enum import IntEnum >>> from enum import IntEnum
>>> class Shape(IntEnum): >>> class Shape(IntEnum):
... circle = 1 ... CIRCLE = 1
... square = 2 ... SQUARE = 2
... ...
>>> class Request(IntEnum): >>> class Request(IntEnum):
... post = 1 ... POST = 1
... get = 2 ... GET = 2
... ...
>>> Shape == 1 >>> Shape == 1
False False
>>> Shape.circle == 1 >>> Shape.CIRCLE == 1
True True
>>> Shape.circle == Request.post >>> Shape.CIRCLE == Request.POST
True True
However, they still can't be compared to standard :class:`Enum` enumerations:: However, they still can't be compared to standard :class:`Enum` enumerations::
>>> class Shape(IntEnum): >>> class Shape(IntEnum):
... circle = 1 ... CIRCLE = 1
... square = 2 ... SQUARE = 2
... ...
>>> class Color(Enum): >>> class Color(Enum):
... red = 1 ... RED = 1
... green = 2 ... GREEN = 2
... ...
>>> Shape.circle == Color.red >>> Shape.CIRCLE == Color.RED
False False
:class:`IntEnum` values behave like integers in other ways you'd expect:: :class:`IntEnum` values behave like integers in other ways you'd expect::
>>> int(Shape.circle) >>> int(Shape.CIRCLE)
1 1
>>> ['a', 'b', 'c'][Shape.circle] >>> ['a', 'b', 'c'][Shape.CIRCLE]
'b' 'b'
>>> [i for i in range(Shape.square)] >>> [i for i in range(Shape.SQUARE)]
[0, 1] [0, 1]
...@@ -656,39 +656,39 @@ flags being set, the boolean evaluation is :data:`False`:: ...@@ -656,39 +656,39 @@ flags being set, the boolean evaluation is :data:`False`::
>>> from enum import Flag >>> from enum import Flag
>>> class Color(Flag): >>> class Color(Flag):
... red = auto() ... RED = auto()
... blue = auto() ... BLUE = auto()
... green = auto() ... GREEN = auto()
... ...
>>> Color.red & Color.green >>> Color.RED & Color.GREEN
<Color.0: 0> <Color.0: 0>
>>> bool(Color.red & Color.green) >>> bool(Color.RED & Color.GREEN)
False False
Individual flags should have values that are powers of two (1, 2, 4, 8, ...), Individual flags should have values that are powers of two (1, 2, 4, 8, ...),
while combinations of flags won't:: while combinations of flags won't::
>>> class Color(Flag): >>> class Color(Flag):
... red = auto() ... RED = auto()
... blue = auto() ... BLUE = auto()
... green = auto() ... GREEN = auto()
... white = red | blue | green ... WHITE = RED | BLUE | GREEN
... ...
>>> Color.white >>> Color.WHITE
<Color.white: 7> <Color.WHITE: 7>
Giving a name to the "no flags set" condition does not change its boolean Giving a name to the "no flags set" condition does not change its boolean
value:: value::
>>> class Color(Flag): >>> class Color(Flag):
... black = 0 ... BLACK = 0
... red = auto() ... RED = auto()
... blue = auto() ... BLUE = auto()
... green = auto() ... GREEN = auto()
... ...
>>> Color.black >>> Color.BLACK
<Color.black: 0> <Color.BLACK: 0>
>>> bool(Color.black) >>> bool(Color.BLACK)
False False
.. note:: .. note::
...@@ -776,12 +776,12 @@ Using :class:`auto` ...@@ -776,12 +776,12 @@ Using :class:`auto`
Using :class:`object` would look like:: Using :class:`object` would look like::
>>> class Color(NoValue): >>> class Color(NoValue):
... red = auto() ... RED = auto()
... blue = auto() ... BLUE = auto()
... green = auto() ... GREEN = auto()
... ...
>>> Color.green >>> Color.GREEN
<Color.green> <Color.GREEN>
Using :class:`object` Using :class:`object`
...@@ -790,12 +790,12 @@ Using :class:`object` ...@@ -790,12 +790,12 @@ Using :class:`object`
Using :class:`object` would look like:: Using :class:`object` would look like::
>>> class Color(NoValue): >>> class Color(NoValue):
... red = object() ... RED = object()
... green = object() ... GREEN = object()
... blue = object() ... BLUE = object()
... ...
>>> Color.green >>> Color.GREEN
<Color.green> <Color.GREEN>
Using a descriptive string Using a descriptive string
...@@ -804,13 +804,13 @@ Using a descriptive string ...@@ -804,13 +804,13 @@ Using a descriptive string
Using a string as the value would look like:: Using a string as the value would look like::
>>> class Color(NoValue): >>> class Color(NoValue):
... red = 'stop' ... RED = 'stop'
... green = 'go' ... GREEN = 'go'
... blue = 'too fast!' ... BLUE = 'too fast!'
... ...
>>> Color.green >>> Color.GREEN
<Color.green> <Color.GREEN>
>>> Color.green.value >>> Color.GREEN.value
'go' 'go'
...@@ -827,13 +827,13 @@ Using an auto-numbering :meth:`__new__` would look like:: ...@@ -827,13 +827,13 @@ Using an auto-numbering :meth:`__new__` would look like::
... return obj ... return obj
... ...
>>> class Color(AutoNumber): >>> class Color(AutoNumber):
... red = () ... RED = ()
... green = () ... GREEN = ()
... blue = () ... BLUE = ()
... ...
>>> Color.green >>> Color.GREEN
<Color.green> <Color.GREEN>
>>> Color.green.value >>> Color.GREEN.value
2 2
...@@ -897,14 +897,14 @@ alias:: ...@@ -897,14 +897,14 @@ alias::
... % (a, e)) ... % (a, e))
... ...
>>> class Color(DuplicateFreeEnum): >>> class Color(DuplicateFreeEnum):
... red = 1 ... RED = 1
... green = 2 ... GREEN = 2
... blue = 3 ... BLUE = 3
... grene = 2 ... GRENE = 2
... ...
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: aliases not allowed in DuplicateFreeEnum: 'grene' --> 'green' ValueError: aliases not allowed in DuplicateFreeEnum: 'GRENE' --> 'GREEN'
.. note:: .. note::
...@@ -1007,10 +1007,10 @@ be provided. It will be checked against the actual order of the enumeration ...@@ -1007,10 +1007,10 @@ be provided. It will be checked against the actual order of the enumeration
and raise an error if the two do not match:: and raise an error if the two do not match::
>>> class Color(Enum): >>> class Color(Enum):
... _order_ = 'red green blue' ... _order_ = 'RED GREEN BLUE'
... red = 1 ... RED = 1
... blue = 3 ... BLUE = 3
... green = 2 ... GREEN = 2
... ...
Traceback (most recent call last): Traceback (most recent call last):
... ...
...@@ -1028,7 +1028,8 @@ and raise an error if the two do not match:: ...@@ -1028,7 +1028,8 @@ and raise an error if the two do not match::
normally accessed as ``EnumClass.member``. Under certain circumstances they normally accessed as ``EnumClass.member``. Under certain circumstances they
can also be accessed as ``EnumClass.member.member``, but you should never do can also be accessed as ``EnumClass.member.member``, but you should never do
this as that lookup may fail or, worse, return something besides the this as that lookup may fail or, worse, return something besides the
:class:`Enum` member you are looking for:: :class:`Enum` member you are looking for (this is another good reason to use
all-uppercase names for members)::
>>> class FieldTypes(Enum): >>> class FieldTypes(Enum):
... name = 0 ... name = 0
...@@ -1078,15 +1079,15 @@ If a combination of Flag members is not named, the :func:`repr` will include ...@@ -1078,15 +1079,15 @@ If a combination of Flag members is not named, the :func:`repr` will include
all named flags and all named combinations of flags that are in the value:: all named flags and all named combinations of flags that are in the value::
>>> class Color(Flag): >>> class Color(Flag):
... red = auto() ... RED = auto()
... green = auto() ... GREEN = auto()
... blue = auto() ... BLUE = auto()
... magenta = red | blue ... MAGENTA = RED | BLUE
... yellow = red | green ... YELLOW = RED | GREEN
... cyan = green | blue ... CYAN = GREEN | BLUE
... ...
>>> Color(3) # named combination >>> Color(3) # named combination
<Color.yellow: 3> <Color.YELLOW: 3>
>>> Color(7) # not named combination >>> Color(7) # not named combination
<Color.cyan|magenta|blue|yellow|green|red: 7> <Color.CYAN|MAGENTA|BLUE|YELLOW|GREEN|RED: 7>
...@@ -267,7 +267,7 @@ class EnumMeta(type): ...@@ -267,7 +267,7 @@ class EnumMeta(type):
This method is used both when an enum class is given a value to match This method is used both when an enum class is given a value to match
to an enumeration member (i.e. Color(3)) and for the functional API to an enumeration member (i.e. Color(3)) and for the functional API
(i.e. Color = Enum('Color', names='red green blue')). (i.e. Color = Enum('Color', names='RED GREEN BLUE')).
When used for the functional API: When used for the functional API:
...@@ -517,7 +517,7 @@ class Enum(metaclass=EnumMeta): ...@@ -517,7 +517,7 @@ class Enum(metaclass=EnumMeta):
# without calling this method; this method is called by the metaclass' # without calling this method; this method is called by the metaclass'
# __call__ (i.e. Color(3) ), and by pickle # __call__ (i.e. Color(3) ), and by pickle
if type(value) is cls: if type(value) is cls:
# For lookups like Color(Color.red) # For lookups like Color(Color.RED)
return value return value
# by-value search for a matching enum member # by-value search for a matching enum member
# see if it's in the reverse mapping (for hashable values) # see if it's in the reverse mapping (for hashable values)
......
...@@ -69,9 +69,9 @@ except Exception as exc: ...@@ -69,9 +69,9 @@ except Exception as exc:
# for doctests # for doctests
try: try:
class Fruit(Enum): class Fruit(Enum):
tomato = 1 TOMATO = 1
banana = 2 BANANA = 2
cherry = 3 CHERRY = 3
except Exception: except Exception:
pass pass
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment