【问题标题】:Dynamic module imports from external function, (or - editing globals() outside of module), in Python在 Python 中从外部函数导入动态模块(或 - 在模块外部编辑 globals())
【发布时间】:2016-06-06 19:34:52
【问题描述】:

我有一个项目,我想在一个类中重复更改代码,然后运行其他模块来测试更改(验证..)。目前,每次编辑后我都必须重新加载代码、运行它的测试模块,然后运行测试。我想把这个循环减少到一行,而且,我稍后会想测试不同的类,所以我希望能够接收被测试类的名称作为参数——这意味着我需要动态导入。

我为任何模块的干净导入编写了一个函数,它似乎可以工作:

def build_module_clean(module_string,attr_strings):
    module = import_module(module_string)
    module = reload(module)
    for f in attr_strings:
        globals()[f]=getattr(module,f)

现在,以清洁的名义,我想将此函数保存在一个包装模块中(其中将包含我想要每次重建和测试所有代码的单行代码),并从各个模块运行它,即在我的ModelChecker 模块的导入语句中,我会放置这一行

from wrapper import build_module_clean
build_module_clean('test_class_module',['test_class_name'])

但是,当我这样做时,似乎测试类已添加到包装模块中的全局变量中,但未添加到 ModelChecker 模块中(尝试访问 ModelChecker 中的 globals()['test_class_name'] 会出现关键错误)。我尝试将globalsglobals() 作为进一步的参数传递给build_module_clean,但globals 是一个函数(因此测试模块仍然加载到包装器globals),然后传递然后使用globals()给出错误

TypeError: 'builtin_function_or_method' object does not support item assignment

所以我需要一些方法来从另一个模块编辑一个模块的globals()


或者,(理想情况下?)我想在包装器中导入test_class 模块,以使其对所有使用它的模块可见(例如ModelChecker)。我该怎么做?

【问题讨论】:

    标签: python dynamic import module globals


    【解决方案1】:

    你的函数应该是这样的:

    def build_module_clean(globals, module_string, attr_strings):
        module = import_module(module_string)
        module = reload(module)
        globals[module_string] = module
        for f in attr_strings:
            globals[f] = getattr(module, f)
    

    然后这样称呼它:

    build_module_clean(globals(), 'test_class_module', ['test_class_name'])
    

    解释:

    在函数调用 (build_module_clean(globals()...) 中调用 globals() 会在仍在正确模块中时获取模块的 __dict__ 并将其传递给您的函数。

    然后该函数能够(重新)将名称分配给新加载的模块及其当前属性。

    请注意,我还(重新)将新加载的模块本身分配给了全局变量(您可能不想要那个部分)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 2021-03-07
      • 2010-11-25
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多