我有一个用于配置的模块projectConfig
,用于分析项目的示例表:
class SampleSheetFields():
FIELD_1 = "field1"
FIELD_2 = "field2"
class SampleSheetFieldsOld():
FIELD_1 = "field_1"
FIELD_2 = "field_2"
我在其他模块中使用了第一个类,比如:
from projectConfig import SampleSheetFields as ssFields
class SomeClass
def __init__(self):
...
check(someContent, ssFields.FIELD_1)
问题是我已经开发了我的软件,使用了大量的
ssFields
引用。在某些时候,新的规范指出,软件还应该使用具有不同字段名的样本表。我发现最快的方法是在不干扰代码的情况下,在SampleSheetFieldsOld
中添加类projectConfig
,并在模块中进行条件导入:class SomeClass:
def __init__(self, useOld):
if useOld:
from projectConfig import SampleSheetFieldsOld as ssFields
else:
from projectConfig import SampleSheetFields as ssFields
...
check(someContent, ssFields.FIELD_1)
请注意,使用的强制字段具有相同的名称,因此不存在冲突或缺少的字段。程序按预期工作。
我的问题是:
如果这种做法不好,它有多糟;以及
我怎样才能绕开它,创造出更好、更可持续的代码?
最佳答案
这可能不是最糟糕的事情,但我发现有点问题的是,您现在被锁定在两个配置选项中,旧的和新的。如果有一天你需要加上第三或第四套等呢?你将不能再使用一个简单的布尔测试了。
此外,看起来您的配置选项都是简单的字符串值,可以通过字符串键访问。你不需要上课。
我的建议是忘记使用源代码进行配置并使用配置文件。在projectConfig
中可以有一个从文件初始化的dict
,其路径/名称可以在命令行中提供,或者以任何方便的方式提供。所以projectConfig.py
可能是这样的:
config_options = {}
def load_configuration(filename):
with open(filename) as f:
for line in f:
# get key and value
config_options[key] = value
然后在需要获取字段名的任何地方,只需访问
projectConfig.config_options['field_key']
,例如。from projectConfig import config_options
class SomeClass
def __init__(self):
...
check(someContent, config_options['FIELD_1'])
如果有合理的默认值,则使用
dict.get(key, default)
。这样,每次需要切换到不同的字段名集时,只需创建一个新的配置文件,而不必接触代码。Python的标准库包含一个
configparser
module可以为您处理加载。