首页 > 解决方案 > 在 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())使它们保持不变,那么它可能是理想的解决方案

标签: pythonpython-3.x

解决方案


看起来您可能会进行枚举

from enum import Enum

class Formats(Enum):
    IMAGE = "..."
    MASK = "..."
    OBJECT = "..."

class Folders(Enum):
    IMAGE = "..."
    MASKS = "..."
    OBJECTS = "..."

推荐阅读