【发布时间】: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'] 会出现关键错误)。我尝试将globals 或globals() 作为进一步的参数传递给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