我有一个用于配置的模块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可以为您处理加载。

10-08 03:07