Python Enum 技巧,讓代碼更簡(jiǎn)潔、更安全、更易維護(hù)
如果你是一名 Python 開(kāi)發(fā)人員,你很可能使用過(guò) enum.Enum
來(lái)創(chuàng)建可讀性和可維護(hù)性代碼。
今天發(fā)現(xiàn)一個(gè)強(qiáng)大的技巧,可以讓Enum的境界更進(jìn)一層,這個(gè)技巧不僅能提高可讀性,還能以最小的代價(jià)增加額外的功能。
在本文中,云朵君和大家一起學(xué)習(xí)一種高級(jí)Enum模式,它能讓你的 Python 代碼更健壯、更易維護(hù)、更高的魯棒性。
為什么在 Python 中使用Enum?
在我們深入探討這個(gè)技巧之前,讓我們先簡(jiǎn)單了解一下 Enums 為什么有用。
枚舉可以幫助你定義一組命名的常量,使你的代碼更易讀、更不易出錯(cuò)。與使用神奇的數(shù)字或硬編碼字符串相比,你可以使用枚舉來(lái)表示具有有意義名稱(chēng)的值。
沒(méi)有Enum(糟糕的做法):
STATUS_PENDING = "pending"
STATUS_APPROVED = "approved"
STATUS_REJECTED = "rejected"
def process(status):
if status == "approved":
print("Processing approved request")
問(wèn)題出在哪里?字符串容易出現(xiàn)錯(cuò)別字,而且缺乏結(jié)構(gòu)。
使用Enum(更好的方法):
from enum import Enum
class Status(Enum):
PENDING = "pending"
APPROVED = "approved"
REJECTED = "rejected"
def process(status: Status):
if status == Status.APPROVED:
print("Processing approved request")
現(xiàn)在,我們的代碼更有條理了,而且還能通過(guò)Enum獲得類(lèi)型安全。
Enum技巧:添加額外功能
雖然標(biāo)準(zhǔn)枚舉很棒,但它們?nèi)匀恢皇腔境A?。如果我們能為每個(gè)Enum成員添加額外的元數(shù)據(jù)或行為呢?
使用 @property
和自定義方法
我們可以通過(guò)添加屬性和方法來(lái)增強(qiáng)Enum,從而提供額外的功能。具體方法如下
from enum import Enum
class Status(Enum):
PENDING = "pending"
APPROVED = "approved"
REJECTED = "rejected"
@property
def description(self):
descriptions = {
"pending": "The request is pending approval.",
"approved": "The request has been approved.",
"rejected": "The request was rejected."
}
return descriptions[self.value]
我們不再需要單獨(dú)管理描述,而是可以直接訪問(wèn)它們:
print(Status.PENDING.description) # Output: The request is pending approval.
print(Status.APPROVED.description) # Output: The request has been approved.
這將使enum更豐富和 self-contained
。
Enum高級(jí)技巧:映射額外數(shù)據(jù)
通過(guò)存儲(chǔ)額外的屬性,還可以在Enum中使用類(lèi)似于 dataclass
的行為。
from enum import Enum
class Status(Enum):
PENDING = ("pending", "??")
APPROVED = ("approved", "?")
REJECTED = ("rejected", "?")
def __init__(self, value, emoji):
self._value_ = value
self.emoji = emoji
@property
def description(self):
descriptions = {
"pending": "The request is pending approval.",
"approved": "The request has been approved.",
"rejected": "The request was rejected."
}
return descriptions[self.value]
# Usage
print(Status.PENDING.emoji) # Output: ??
print(Status.APPROVED.description) # Output: The request has been approved.
- 將相關(guān)數(shù)據(jù)保存在一起 - 無(wú)需外部映射。
- 提高可維護(hù)性 - 狀態(tài)的更改不需要修改代碼的多個(gè)部分。
- 提高可讀性 - 開(kāi)發(fā)人員可以快速查看可用狀態(tài)及其屬性。
圖片
https://docs.python.org/zh-cn/3.7/library/enum.html
寫(xiě)在最后
Python 的 enum.Enum
不僅僅是一個(gè)常量集合。通過(guò)添加屬性、方法和額外屬性,你可以讓Enum成為應(yīng)用程序中強(qiáng)大的工具。無(wú)論你是在構(gòu)建網(wǎng)絡(luò)應(yīng)用程序、API 還是 CLI 工具,這一技巧都能幫助你編寫(xiě)出更簡(jiǎn)潔、更有條理的代碼。
下一次使用Enum時(shí),不要局限于基本的常量--用這個(gè)強(qiáng)大的技巧釋放它們的全部潛能!