python-3.x - 在这种情况下使用枚举是否合理?
问题描述
所以我过去常常将配置维护为 dicts,然后偶然发现了 python 中的枚举。以下是我以前做的:
CONFIG = {
"field1": {"field11": "value11", ....},
"field2": {"field12": "value22", .....},
}
这将是一个全局的,并且将包含我的应用程序将使用的一些配置。然后我使用枚举进行了相同的转换,如下所示:
from enum import Enum, unique
@unique
class Config(Enum):
field1 = {"field11": "value11", .....}
field2 = {"field22": "value22", .....}
一开始使用枚举的好处很模糊,但是当我深入挖掘时,我发现枚举是不可变的,可以强制唯一性,并且它提供了一种更清洁的方式来遍历其成员。
我检查了这是否在任何 python 第三方或标准库中使用。我发现他们中的大多数都使用如下类:
class Config:
field1 = {"field11": "value11", .....}
field2 = {"field22": "value22", .....}
所以我的问题是,枚举是保存不应该被意外更改的配置的好选择,或者它只是矫枉过正,并且可以使用类来代替吗?
想知道哪一个被认为是最佳做法。
解决方案
在你的问题中使用 enum 的主要优点是它允许在代码中编写符号常量,而使用字典你必须检查字典中的键,例如:
Config.field1
相对
Config["field1"]
因此,差异将是语法上的优势,但与字典不同,枚举本质上是不可变的,并且与类不同,枚举不能扩展。
推荐阅读
- python - PySmbClient 取消链接:错误:序列项 0:应为字节状对象,找到 str
- c - 为什么必须先输入字符?
- javascript - 如何从 JavaScript 中的字符串中删除除 div 和 span 之外的 HTML 标记?
- git - git:致命超过最大包含深度
- node.js - 在詹金斯管道中,在 azure kubernetes 服务的 Kubernetes pod 中进行 docker build 时,在 unix 上遇到问题 Docker daemon socket
- c# - 我从未见过的 C# 迭代
- multithreading - 如果我想从 GTK+ 应用程序启动程序,我应该使用什么 GTK+ 子进程/线程/程序执行/等?
- javascript - 将功能打印到控制台时未定义 concat 错误
- sql - 使用 SQL 测试“二进制字符串”A 是否是“二进制字符串”B 的子集
- google-workspace - 需要在 Google Workspace 的“目录”文件夹中创建联系人