重新加载模块会导致不同的结果

时间:2012-07-27 16:49:56

标签: python import module python-module

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

这就是我的所作所为:

import mymodule
import mymodule.rules as rules

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

    # The rest of the test case

这一切都很好,或者当两个重新加载被注释掉时,但是当我注释掉第二次重新加载时,测试的结果是不同的。在重新加载过程中是否会发生某些事情,我不知道重新加载模块后需要从模块重新加载所有脚本?还有其他解释吗?

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

from mymodule import Rule

2 个答案:

答案 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()

根据docsreload()

  

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

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