枚举是绑定到惟一的常量值的一组符号名称(成员)。在枚举中,成员能够经过身份进行比较,枚举自己能够迭代。编程
该模块定义了四个枚举类,可用于定义惟一的名称和值集:Enum,IntEnum,Flag和IntFlag。它还定义了一个装饰器,unique()和一个helper,auto。app
Content | Description | Remarks |
class enum.Enum | 建立枚举实例的基类 | |
class enum.IntEnum | 用于建立同属于int子类枚举常量的基类 | |
class enum.IntFlag | 用于建立枚举常量的基类,能够使用按位运算符组合而不会丢失其IntFlag成员资格。 IntFlag成员也是int的子类。 | New in version 3.6 |
class enum.Flag | 用于建立枚举常量的基类,能够使用按位运算符组合而不会丢失其IntFlag成员资格。 | New in version 3.6 |
unique() | 枚举类装饰器,用于确保任何一个值只有一个名字与其绑定 | |
class enum.auto | 实例被替换为枚举成员的合适值 | New in version 3.6 |
建立一个枚举类很简单,以下所示:函数
>>> from enum import Enum >>> class Color(Enum): ... RED = 1 ... GREEN = 2 ... BLUE = 3 ...
说明:spa
(1) 枚举类得成员值能够是任何值,好比int,str等。若是肯定值不重要,你能够使用auto实例来产生一个合适值。可是混用auto实例和其余值必定要慎重。翻译
(2) 类Color是一个枚举。属性Color.RED,Color.GREEN等是枚举成员(或枚举成员),而且是函数常量。枚举成员具备名称和值(Color.RED的名称为RED,Color.BLUE的值为3等)code
枚举成员拥有易读的字符表现形式:blog
>>> print(Color.RED) Color.RED
利用repr()函数能够获得更多信息:ip
>>> print(repr(Color.RED)) <Color.RED: 1>
枚举成员的类型是它所属的枚举:ci
>>> type(Color.RED) <enum 'Color'> >>> isinstance(Color.GREEN, Color) True >>>
枚举成员也有一个只包含其项目名称的属性:it
>>> print(Color.RED.name) RED
枚举支持迭代,按定义顺序:
>>> class Shake(Enum): ... VANILLA = 7 ... CHOCOLATE = 4 ... COOKIES = 9 ... MINT = 3 ... >>> for shake in Shake: ... print(shake) ... Shake.VANILLA Shake.CHOCOLATE Shake.COOKIES Shake.MINT
枚举成员能够是哈希的,因此它们能够在字典和集合中使用:
>>> apples = {} >>> apples[Color.RED] = 'red delicious' >>> apples[Color.GREEN] = 'granny smith' >>> apples == {Color.RED: 'red delicious', Color.GREEN: 'granny smith'} True
有时候以编程方式访问成员函数(即Color.RED不会执行的状况是有用的,由于在程序写入时间没有确切的颜色)。枚举容许这样的访问:
>>> Color(1) <Color.RED: 1> >>> Color(3) <Color.BLUE: 3>
若是你想用名字访问枚举成员,能够使用项目访问:
>>> Color['RED'] <Color.RED: 1> >>> Color['GREEN'] <Color.GREEN: 2>
若是你有一个枚举成员,而且须要它的名字和值:
>>> member = Color.RED >>> member.name 'RED' >>> member.value 1
两个枚举成员拥有相同的名字是不合法的:
>>> class Shape(Enum): ... SQUARE = 2 ... SQUARE = 3 ... Traceback (most recent call last): ... TypeError: Attempted to reuse key: 'SQUARE'
可是,两个枚举成员容许拥有相同的值。若是两个成员A和B有相同的值(而且A先定义),B是A的一个别名。根据值查询A和B都会放回A。根据名字查询B也会返回A。
>>> class Shape(Enum): ... SQUARE = 2 ... DIAMOND = 1 ... CIRCLE = 3 ... ALIAS_FOR_SQUARE = 2 ... >>> Shape.SQUARE <Shape.SQUARE: 2> >>> Shape.ALIAS_FOR_SQUARE <Shape.SQUARE: 2> >>> Shape(2) <Shape.SQUARE: 2>
注意:尝试去建立一个与已定义属性同名的成员或者尝试建立一个与成员同名的方法是不容许的。
默认状况下,枚举容许多个名称做为同一个值的别名。当不须要此行为时,能够使用如下装饰器来确保每一个值在枚举中仅使用一次:
@
enum.
unique
专门用于枚举的类装饰器。它搜索枚举的__members__收集它发现的任何别名;若是有的话,会发现ValueError带有细节:
>>> 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
若是确切的值不重要,您能够使用auto:
>>> from enum import Enum, auto >>> class Color(Enum): ... RED = auto() ... BLUE = auto() ... GREEN = auto() ... >>> list(Color) [<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]
auto产生的值由_generate_next_value_()函数产生,该函数能够被重写:
>>> class AutoName(Enum): ... def _generate_next_value_(name, start, count, last_values): ... return name ... >>> class Ordinal(AutoName): ... NORTH = auto() ... SOUTH = auto() ... EAST = auto() ... WEST = auto() ... >>> list(Ordinal) [<Ordinal.NORTH: 'NORTH'>, <Ordinal.SOUTH: 'SOUTH'>, <Ordinal.EAST: 'EAST'>, <Ordinal.WEST: 'WEST'>]