有条件进口的良好做法

2024-09-30 18:22:29 发布

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

我有一个用于配置的模块projectConfig,用于分析项目的示例表:

class SampleSheetFields():
    FIELD_1 = "field1"
    FIELD_2 = "field2"


class SampleSheetFieldsOld():
    FIELD_1 = "field_1"
    FIELD_2 = "field_2"

我在其他类似模块中使用了第一堂课:

^{pr2}$

问题是我开发软件时经常引用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)

请注意,所使用的强制字段具有相同的名称,因此没有冲突或缺少字段。程序按预期工作。在

我的问题是:

  1. 如果这种做法不好,有多糟糕;以及
  2. 我如何才能绕过它,以制定一个更好、更可持续的代码?在

Tags: 模块项目代码fromimport示例fieldas
2条回答

如果只需要类属性,可以创建一个类工厂,使用^{}创建新类,如:

FIELDS = dict(
    new=dict(FIELD_1="field1", FIELD_2="field2"),
    old=dict(FIELD_1="field_1", FIELD_2="field_2"),
}


def sample_sheet_field_factory(field_spec='new'):
    return type("SampleSheetFields", (object,), FIELDS[field_spec])

这可以很容易地扩展到更多的字段规范集,并且不需要条件导入:

^{pr2}$

您还可以使用^{},而不是一个类,这样会更轻量级一些。注意编辑是否符合the style guide。在

这可能不是最糟糕的事情,但我发现有点问题的是,你现在被锁定在两个配置选项中,旧的和新的。如果有一天你需要添加第三个或第四个等集呢?你再也不能使用简单的布尔测试了。在

此外,您的配置选项看起来都只是简单的字符串值,可以通过字符串键访问。你不需要上课。在

我的建议是忘记用源代码进行配置,而使用配置文件。在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'],例如

^{pr2}$

或者使用dict.get(key, default),如果有一个合理的默认值。这样,每次需要切换到一组不同的字段名时,只需创建一个新的配置文件,而不必接触代码。在

Python的标准库包含一个^{} module,它可以为您处理加载。在

相关问题 更多 >