列舉

列舉 在 Python

1 個練習

關於 列舉

在 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

只有在enum未定義任何成員時,才允許繼承Enum。 更多細節與說明,請參閱enum使用指南和enum食譜。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟