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

2024-09-30 01:23:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

DICT_KEY1 = 'DICT_KEY1'
DICT_KEY2 = 'DICT_KEY2'
...

很多时候,我并不介意实际的文字是什么,只要它们是人类读者可以理解的唯一文字。 这样,在整个项目中重构和更改文字就更容易了

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

例如,类似这样的方法可能会奏效:

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

assert DictKeys.DICT_KEY1 == 'DICT_KEY1'

Tags: 项目方法字符串声明标准人类dict重构
2条回答

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

def string_consts(cls):
    for key, value in cls.__annotations__.items():
        if value is str:
            setattr(cls, key, key)
    return cls

这使得

@string_consts
class DictKeys:
    DICT_KEY1: str
    DICT_KEY2: str

assert DictKeys.DICT_KEY1 == 'DICT_KEY1'

如您的示例所示,工作OOTB

在全球层面上,您可以这样做:

for i in range(100):
  globals()['DICT_KEY'+str(i)] = 'DICT_KEY'+str(i)

在类级别,setattr可以以相同的方式使用:

for i in range(100):
  setattr(self, 'DICT_KEY'+str(i), 'DICT_KEY'+str(i))

如果您的密钥不是问题所建议的数字列表,您仍然可以执行以下操作:

for key in ['KEY', 'OTHERKEY', 'SOMEOTHERKEY']:
  globals()[key] = key

在我看来,这比使用decorator解决方案更容易理解,而且可以完成这项工作

相关问题 更多 >

    热门问题