在测试期间,我在我的测试用例中添加了一个重新加载命令,因此我可以在几个不同的地方更改代码,而无需手动重新加载所有内容,并且我注意到重新加载似乎会影响测试结果。
这就是我的所作所为:
import mymodule
import mymodule.rules as rules
def testcase():
reload(mymodule)
reload(rules)
# The rest of the test case
这一切都很好,或者当两个重新加载被注释掉时,但是当我注释掉第二次重新加载时,测试的结果是不同的。在重新加载过程中是否会发生某些事情,我不知道重新加载模块后需要从模块重新加载所有脚本?还有其他解释吗?
我不确定这是否相关,但规则是包含此行的包内的单独脚本:
from mymodule import Rule
答案 0 :(得分:2)
您问题中的信息相当含糊,而且您的术语相当不标准。从
规则是mymodule中的一个单独脚本。
我推断mymodule
实际上是一个包,它似乎在导入时不会自动导入rules
。这意味着在执行
import mymodule
没有mymodule.rules
,但在执行
import mymodule.rules as rules
模块rules
将导入mymodule
的命名空间。 (旁注:后一个代码行通常写为from mymodule import rules
。)
执行第一个reload()
语句后,您将获得mymodule
的frsh副本,该副本不包含mymodule.rules
- 这只会在第二个reload()
之后重新创建言。
我不得不为这个答案做很多猜测,所以我可能弄错了。 reload()
语句有很多细微之处,可以在documentation中看到,所以如果你对Python的导入机制非常熟悉,最好只使用它。
(另请注意:如果rule.py
位于包mymodule
内,正如您的设置似乎是,那么您应该在那里使用相对导入。而不是
from mymodule import Rule
你应该做
from . import Rule
我还建议使用from __future__ import absolute_import
来获得更透明的导入规则。)
答案 1 :(得分:1)
我不确定究竟是什么导致了您的问题,但我认为您可能会误导reload()
。
根据docs,reload()
将
重新加载以前导入的模块。
但是,如果您在测试用例中运行它,则在导入模块和重新加载模块之间模块不会有任何更改,对吧?为了进行更改,我认为您必须在测试用例运行时更改这些文件,这可能不是一个好主意。