在python中定义一组(也许是分层的)常量的最佳方法是什么?

时间:2019-11-28 14:57:35

标签: python python-3.x

假设我必须定义一组常量,例如

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())来使它们恒定,则可能是理想的解决方案

1 个答案:

答案 0 :(得分:0)

您似乎可以伸手去拿enumeration

from enum import Enum

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

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