用于命名字符串常量的 Python 构造

Mic*_*vin 2 python

我经常使用字符串常量,例如:

DICT_KEY1 = 'DICT_KEY1'
DICT_KEY2 = 'DICT_KEY2'
...
Run Code Online (Sandbox Code Playgroud)

很多时候我并不介意实际的文字是什么,只要它们对人类读者来说是独一无二的并且可以理解的。通过这种方式,可以更轻松地在整个项目中重构和更改文字。

所以我的问题是,是否有一种标准方法可以使这些字符串常量声明更简单?我不想重复写文字'DICT_KEYn'

例如,这样的事情可以工作:

@string_consts
class DictKeys:
    DICT_KEY1: str
    DICT_KEY2: str
    ...

assert DictKeys.DICT_KEY1 == 'DICT_KEY1'
Run Code Online (Sandbox Code Playgroud)

AKX*_*AKX 8

如果有帮助,您的string_consts装饰器的实现将是

def string_consts(cls):
    for key, value in cls.__annotations__.items():
        if value is str:
            setattr(cls, key, key)
    return cls
Run Code Online (Sandbox Code Playgroud)

这使得

@string_consts
class DictKeys:
    DICT_KEY1: str
    DICT_KEY2: str

assert DictKeys.DICT_KEY1 == 'DICT_KEY1'
Run Code Online (Sandbox Code Playgroud)

就像在您的示例工作 OOTB 中一样。