我有一个配置模块 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
。在某些时候,新规范规定该软件还应使用具有不同字段名称的样本表。我发现实现该目标的最快方法是在 projectConfig
中添加类 SampleSheetFieldsOld
并在我的模块中进行条件导入:
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)
请注意,所使用的必填字段具有相同的名称,因此不存在冲突或缺失的字段。该程序按预期工作。
我的问题是:
- 这种做法有多糟糕,如果不好的话;和
- 我怎样才能规避它以制定更好、更可持续的代码?
最佳答案
这可能不是最糟糕的事情,但我确实发现有点问题的是您现在被锁定在两个配置选项中,旧的和新的。如果有一天你需要添加第三个或第四个等等怎么办?您将无法再使用简单的 bool 测试。
此外,您的配置选项看起来都只是简单的字符串值,可通过字符串键访问。你不需要为此上课。
我的建议是忘记使用源代码进行配置并使用配置文件。在您的 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它可以为您处理负载。
关于python - 有条件进口的良好做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33779618/