数据STUDIO

Python Enum 技巧,让代码更简洁、更安全、更易维护

Image

Image

如果你是一名 Python 开发人员,你很可能使用过 enum.Enum 来创建可读性和可维护性代码。

今天发现一个强大的技巧,可以让Enum的境界更进一层,这个技巧不仅能提高可读性,还能以最小的代价增加额外的功能。

在本文中,云朵君和大家一起学习一种高级Enum模式,它能让你的 Python 代码更健壮、更易维护、更高的鲁棒性。

What is enum in Python - Mindmajix

为什么在 Python 中使用Enum?

在我们深入探讨这个技巧之前,让我们先简单了解一下 Enums 为什么有用。

枚举可以帮助你定义一组命名的常量,使你的代码更易读、更不易出错。与使用神奇的数字或硬编码字符串相比,你可以使用枚举来表示具有有意义名称的值。

没有Enum(糟糕的做法):

STATUS_PENDING = "pending"
STATUS_APPROVED = "approved"
STATUS_REJECTED = "rejected"

def process(status):
if status == "approved":
print("Processing approved request")

问题出在哪里?字符串容易出现错别字,而且缺乏结构。

使用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")

现在,我们的代码更有条理了,而且还能通过Enum获得类型安全。

Enum技巧:添加额外功能

虽然标准枚举很棒,但它们仍然只是基本常量。如果我们能为每个Enum成员添加额外的元数据或行为呢?

使用 @property 和自定义方法

我们可以通过添加属性和方法来增强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]

我们不再需要单独管理描述,而是可以直接访问它们:

print(Status.PENDING.description)  # Output: The request is pending approval.
print(Status.APPROVED.description)  # Output: The request has been approved.

这将使enum更丰富和 self-contained。

Enum高级技巧:映射额外数据

通过存储额外的属性,还可以在Enum中使用类似于 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.
  • 将相关数据保存在一起 - 无需外部映射。
  • 提高可维护性 - 状态的更改不需要修改代码的多个部分。
  • 提高可读性 - 开发人员可以快速查看可用状态及其属性。
Image
https://docs.python.org/zh-cn/3.7/library/enum.html

写在最后

Python 的 enum.Enum 不仅仅是一个常量集合。通过添加属性、方法和额外属性,你可以让Enum成为应用程序中强大的工具。无论你是在构建网络应用程序、API 还是 CLI 工具,这一技巧都能帮助你编写出更简洁、更有条理的代码。

下一次使用Enum时,不要局限于基本的常量--用这个强大的技巧释放它们的全部潜能!

🏴‍☠️宝藏级🏴‍☠️ 原创公众号『数据STUDIO』内容超级硬核。公众号以Python为核心语言,垂直于数据科学领域,包括可戳👉Python|MySQL|数据分析|数据可视化|机器学习与数据挖掘|爬虫等,从入门到进阶!

长按👇关注- 数据STUDIO -设为星标,干货速递ImageImage