python - 在 python 中定义一组(可能是分层的)常量的最佳方法是什么?
问题描述
假设我必须定义一组常量,比如
IMAGE_FOLDER="..."
MASKS_FOLDER="..."
OBJECTS_FOLDER="..."
IMAGE_FMT="...",
MASK_FMT="...",
OBJECT_FMT="...",
FORMATS=(IMAGE_FMT, MASK_FMT, OBJECT_FMT)
...
(常见的用例是将一些字符串常量保存在一个变量中,以免通过多次键入“image”而出现拼写错误)
定义它的最佳方法是什么(如果我有很多)。我可以看到几种解决方案,例如types.SimpleNamespace
或创建自定义类。但是,如果我希望递归地分配这些常量,例如,constants.folder.image
而不是constants.image_folder
有没有比自定义类更通用的做法或更好的解决方案?
UPD:自定义类解决方案如下所示
class Constants:
class Formats:
OBJECT = "objects_format"
MASK = "masks_format"
class Folders:
IMAGE = "images_folder"
OBJECTS = "objects_folder"
MASKS = "masks_folder"
class Extensions:
IMAGE = {".bmp", ".png", ".jpeg", ".jpg", ".tif", ".tiff"}
OBJECTS = {".xml"}
MASKS = {".bmp", ".png", ".jpeg", ".jpg", ".tif", ".tiff"}
class DatasetColumns:
ID = "ID"
IMAGE = "image"
OBJECTS = "object"
MASK = "mask"
所以“递归属性”意味着我可以通过点递归访问,比如 Constants.DatasetColumns.ID
这个自定义类解决方案的问题是这些属性并不是真正的常量。也许我真的不需要它们……但是如果您知道如何使用与定义的代码量大致相同的代码直接访问(没有 Enum 的 .value())使它们保持不变,那么它可能是理想的解决方案
解决方案
看起来您可能会进行枚举:
from enum import Enum
class Formats(Enum):
IMAGE = "..."
MASK = "..."
OBJECT = "..."
class Folders(Enum):
IMAGE = "..."
MASKS = "..."
OBJECTS = "..."
推荐阅读
- java - 为 Spring OAuth 授权代码流输入用户凭证
- redirect - DocuSign OAuth 登录取消链接重定向到错误的 URL
- c++ - UVa 练习 11799 报告运行时错误
- javascript - 表现为独特元素的克隆元素
- sql-server - 在命名计算表达式中声明一个局部变量
- android - 如何通过单击应用程序本身以 CSV 格式下载整个 Firebase RealtimeDatabase?
- printing - 试图理解旧的 PCL 文件
- javascript - 组件不会在状态更改时重新渲染?
- android - 如何检测未接听的拨出电话?
- java - 检查链接的 URL 状态代码时,无法将 HttpResponseCode 的错误解析为类型