python - 有条件进口的良好做法

标签 python import maintainability

我有一个配置模块 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)

请注意,所使用的必填字段具有相同的名称,因此不存在冲突或缺失的字段。该程序按预期工作。

我的问题是:

  1. 这种做法有多糟糕,如果不好的话;和
  2. 我怎样才能规避它以制定更好、更可持续的代码?

最佳答案

这可能不是最糟糕的事情,但我确实发现有点问题的是您现在被锁定在两个配置选项中,旧的和新的。如果有一天你需要添加第三个或第四个等等怎么办?您将无法再使用简单的 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/

相关文章:

python - Python 设置的无序可以被认为是随机顺序吗?

python - 我如何使用callfromthread来调用twisted协议(protocol)的方法?

python - 如何在类初始化期间导入模块

java - 在Java中导入多个类文件

python - 使用 pytest 正确导入

Java货币转换器秉承OO(面向对象)原则

python - 如何构建我的 Django 网页抓取项目?

python - Microsoft Azure 应用程序网关阻止 python 的请求库

c++ - 参数或方法重载的魔数(Magic Number)?

c++ - 创建 myNew/myDelete 替换 new/new[]/delete/delete[]