我有一个项目,我想在其中重复更改类中的代码,然后运行其他模块来测试更改(验证..)。目前,每次编辑后我都要重新加载代码,运行它的测试模块,然后运行测试。我想将这个循环减少到一行,而且,我稍后想要测试不同的类,所以我希望能够将测试类的名称作为参数接收 - 这意味着我需要动态导入。
我为任何模块的干净导入编写了一个函数,它似乎起作用:
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
模块的import语句中,我会放置行
from wrapper import build_module_clean
build_module_clean('test_class_module',['test_class_name'])
然而,当我这样做时,似乎测试类被添加到包装器模块中的全局变量中,但不会添加到ModelChecker
模块中(试图访问globals()['test_class_name']
中的ModelChecker
给出了一个关键错误)。我已尝试将globals
或globals()
作为其他参数传递给build_module_clean
,但globals
是一个函数(因此测试模块仍然会加载到包装器globals
传递然后使用globals()
给出错误
TypeError: 'builtin_function_or_method' object does not support item assignment
所以我需要一些方法来编辑另一个模块中的一个模块globals()
。
或者,(理想情况下?)我想在包装器中导入test_class
模块,使其对所有使用它的模块都可见(例如ModelChecker
)。我怎么能这样做?
答案 0 :(得分:0)
您的功能应如下所示:
build_module_clean(globals(), 'test_class_module', ['test_class_name'])
并称之为:
globals()
说明:
在函数调用(build_module_clean(globals()...
)中调用__dict__
会在仍然在正确的模块中时抓取模块的String(array.map(UnicodeScalar.init).map(Character.init))
并将其传递给您的函数。
然后该函数能够(重新)将名称分配给新加载的模块及其当前属性。
请注意,我还(重新)将新加载的模块本身分配给全局变量(您可能不需要该部分)。