Python 列舉練習:名稱、值與尋找
列舉給狀態、顏色、方向這類概念一組固定名稱。成員是真實物件,而不是散落的字串,因此比較和尋找都更明確。
定義一組封閉成員
繼承 Enum,並給名稱賦值。類體定義可用成員。按慣例成員名大寫,儲存的值可以是字串、數字或其他可雜湊物件。
from enum import Enum
class Status(Enum):
OPEN = "open"
CLOSED = "closed"
print(Status.OPEN.value)名稱與穩定值
名稱和值不是一回事
成員是列舉物件。name 是類中使用的標識符,value 是賦給它的資料。直接列印成員會顯示限定名稱,而 .value 回傳底層資料。
from enum import Enum
class Color(Enum):
RED = "red"
member = Color.RED
print(member.name)
print(member.value)
print(member)同一個成員的三種視圖
按值或按名稱尋找
用值呼叫列舉會回傳比對成員,沒有比對時拋出 ValueError。方括號尋找使用成員名,找不到時拋出 KeyError。根據手上的輸入選擇尋找方式。
from enum import Enum
class Color(Enum):
RED = "red"
GREEN = "green"
print(Color("green"))
print(Color["RED"])兩個方向的尋找
按定義順序走訪
走訪列舉會按定義順序產生成員。這適合建構選單或驗證選項集合。普通走訪會跳過別名,除非直接查看成員映射。
from enum import Enum
class Size(Enum):
SMALL = 1
MEDIUM = 2
LARGE = 3
print([item.name for item in Size])保留定義順序
用 auto 生成值
當具體數字不重要時,auto 可以讓 Python 自動賦值。這樣源碼可以專注於成員名稱。不要把自動生成的數字當作穩定的外部格式。
from enum import Enum, auto
class Step(Enum):
START = auto()
FINISH = auto()
print(Step.START.value)
print(Step.FINISH.value)讓 Python 給成員編號
你的練習清單
- 固定命名選項集合使用 Enum。
- 用 .name 讀取標識符,用 .value 讀取儲存的資料。
- 按值尋找用 Color(value),按名稱尋找用 Color[name]。
- 記住走訪順序就是定義順序。
- 只有具體儲存值不重要時才使用 auto。
常見問題
列舉成員等於它的值嗎?
不等於。Color.RED 與字串 red 不相等。需要底層值時比較 Color.RED.value。
兩個名稱可以共用一個值嗎?
可以。第二個名稱會成為第一個成員的別名,普通走訪會跳過別名。
應該把列舉值存進資料庫嗎?
應儲存有意設計的穩定值,而不是成員物件。以後修改值可能破壞已存資料,所以要把值當成格式的一部分。
練習列舉
12 道題,覆蓋成員、名稱與值、尋找、走訪和 auto。
繼續閱讀: