在 Python 中,列舉(英文:enum)是一組獨特的名稱,每個名稱都綁定到獨特且固定的值。列舉是透過繼承Enum類別來定義的。內建的列舉型別可以在enum模組中使用,而Enum類別可以用from enum import Enum匯入。
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
請注意,enum成員的值可以是任何資料型態,例如str、tuple、float等等。
class Color(Enum):
RED = 'red'
GREEN = 'green'
Enums也可以用函式呼叫語法來建立。
from enum import Enum
Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
Animal.ANT.value
#=> 1
在enum中將相同的值指定給兩個成員時,後指定的成員會成為前一個成員的別名。不允許對enum中兩個不同的成員使用相同的名稱。
class Color(Enum):
RED = 1
GREEN = 2
ALIAS_OF_RED = 1
Color.ALIAS_OF_RED
#=> <Color.RED: 1>
使用標準的for member in語法即可疊代列舉的成員:
for member in Color:
print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)
# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)
Enum成員可以使用is(身分運算子)或is not來比較。==或!=(相等運算子)的運作方式也一樣:
a = Color.RED
a is Color.RED
#=> True
a == Color.RED
#=> True
若要指定整數值,auto()函式會從1開始,並自動設定後續的值。
class Shape(Enum):
CIRCLE = auto()
SQUARE = auto()
OVAL = auto()
若要禁止別名(避免以不同名稱重複相同的值),可以使用類別裝飾器@enum.unique。
@enum.unique
class Shape(Enum):
CIRCLE = 1
SQUARE = 2
TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE
若要依給定的值存取enum成員,可以使用這種表示法:<EnumName>(<value>)。
g = Color(2)
g is Color.GREEN
#=> True
g
#=> <Color.GREEN: 2>
只要用任何 mix-in 或資料型態來繼承Enum類別,就能寫出自訂的受限Enum。
例如:
class StrEnum(str, Enum):
pass