我注意到一些奇怪的情况,如以下测试失败:
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正常导入缓存行为的操作。你知道吗
一个模块被加载两次还有其他原因吗?我看到过关于这个的声明(例如,https://stackoverflow.com/a/10989692/1332492),但是我无法用一个简单的、孤立的脚本来重现它。你知道吗
我相信你误解了^{} 的工作原理:
根据文件:
如您所见,
__import__
不返回子模块,而只返回top包。如果在包级别也定义了function
,那么确实会有不同的引用。你知道吗如果只想加载模块,应该使用^{} 而不是
__import__
。你知道吗至于回答您的实际问题:恐怕没有办法导入相同的模块,和相同的名称,两次而不搞乱导入机制。但是,包的子模块也可以在
sys.path
中使用,在这种情况下,您可以使用不同的名称导入它两次:这有时会导致问题,例如
pickle
。如果对submodule
引用的内容进行pickle,则不能使用submodule2
作为引用来取消对其的pickle。你知道吗但是,这并没有涉及您给我们的具体示例,因为使用
__module__
属性导入应该返回正确的模块。你知道吗相关问题 更多 >
编程相关推荐