枚舉是綁定到惟一的常量值的一組符號名稱(成員)。在枚舉中,成員能夠經過身份進行比較,枚舉自己能夠迭代。編程
該模塊定義了四個枚舉類,可用於定義惟一的名稱和值集: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'>]