1

在测试期间,我向我的测试用例添加了一个重新加载命令,这样我就可以在几个不同的地方更改代码,而不必手动重新加载所有内容,我注意到重新加载似乎会影响测试结果。

这是我所做的:

import mymodule
import mymodule.rules as rules

def testcase():
    reload(mymodule)
    reload(rules)

    # The rest of the test case

一切都像这样正常工作,或者当两次重新加载都被注释掉时,但是当我注释掉第二次重新加载时,测试的结果是不同的。在重新加载过程中是否发生了一些我不知道的事情,一旦重新加载模块,就需要重新加载模块中的所有脚本?还有其他解释吗?

我不确定这是否相关,但 rules 是包含此行的包内的单独脚本:

from mymodule import Rule
4

2 回答 2

2

您问题中的信息相当模糊,您的术语也相当不标准。从

rules 是 mymodule 中的一个单独脚本。

我推断它mymodule实际上是一个包,它似乎在导入时不会自动rules导入。这意味着执行后

import mymodule

不会有mymodule.rules,但执行后

import mymodule.rules as rules

该模块rules将被导入到mymodule. (旁注:后面的代码行通常写为from mymodule import rules。)

执行第一条语句后,您将获得一个不包含reload()的 frsh 副本- 这只会在第二条语句之后重新创建。mymodulemymodule.rulesreload()

我不得不为这个答案做很多猜测,所以我可能弄错了。从它的文档reload()中可以看出,该语句有很多微妙之处,因此最好仅在您非常熟悉 Python 的导入机制时使用它。

(另一个注意事项:如果rule.py位于 package 内mymodule,就像您的设置一样,您应该在那里使用相对导入。而不是

from mymodule import Rule

你应该做

from . import Rule

我还建议from __future__ import absolute_import使用更透明的导入规则。)

于 2012-07-27T16:59:56.197 回答
1

我不确定到底是什么导致了您的问题,但我认为您可能在滥用reload().

根据文档reload()

重新加载以前导入的模块。

但是,如果您在测试用例中运行它,则在导入模块和重新加载模块之间不会对模块进行任何更改,对吗?为了进行更改,我认为您必须在测试用例运行时更改这些文件,这可能不是一个好主意。

于 2012-07-27T17:00:25.223 回答