【发布时间】:2014-01-24 02:27:45
【问题描述】:
我注意到一些奇怪的情况,如下所示的测试失败:
x = <a function from some module, passed around some big application for a while>
mod = __import__(x.__module__)
x_ref = getattr(mod, x.__name__)
assert x_ref is x # Fails
(这样的代码出现在pickle模块中)
我认为我没有任何会干扰 python 正常导入缓存行为的导入钩子、重新加载调用或 sys.modules 操作。
模块会被加载两次还有其他原因吗?我已经看到有关此的声明(例如,https://stackoverflow.com/a/10989692/1332492),但我无法在一个简单、孤立的脚本中重现它。
【问题讨论】:
-
assert x_ref == x说什么? -
也是错误的,但我认为实际上调用函数总是给出相同的结果
-
这些模块有
__file__属性吗?测试它们是否是完全相同的模块。 -
我不确定如何测试它,因为
x.__module__给出的是字符串而不是模块对象。我可以打印__import__(x.__module__).__file__,但我不知道拿什么来比较 -
我以为我在过去看到过一些奇怪的案例,进口方式不同......即用户会执行
import x.y,然后是x.y.something(),然后另一个函数会执行from x import y,然后是y.something_else(),第二个函数看不到第一个函数的结果。但我现在无法重现它......
标签: python python-import