当你在包内导入时,Python 2.7 做了一些非常奇特的事情。基本上,它存储内置函数的相对导入(除其他外),其原因我真的无法理解。最小用例如下。
假设目录结构如下:
\BaseFolder
* __init__.py
* MainFile.py
\TestFolder
* __init__.py
* TestModule.py
两个 __init__.py 都是空的。 MainFile.py 仅说明:
import TestFolder.TestModule
import sys
for x in sorted(sys.modules.keys()):
print x
TestModule.py 说:
import os
使用 Python 运行 MainFile.py 将为您提供导入模块的列表。当你查看模块的键时,有一堆垃圾,但你可以找到以下键:
TestFolder
TestFolder.TestModule
TestFolder.os
...
os
如果您查看这些模块的值,会发现 TestFolder.os 为 None。但它首先为何存在?为什么模块列表会注册一个在查找时已被证明不存在的模块?我认为发生这种情况是因为系统首先在 TestFolder 中检查“os”库(因此是 TestFolder.os),然后在内置程序中查找。为什么仅仅因为您检查过就添加条目?有谁知道Python为什么要这么做?也许只是为了不再检查这些位置的库?
最佳答案
缓存包括未命中和命中。 TestFolder.os==None 只是意味着 python 寻找一个名为“os”的包相关模块,没有找到它,然后继续往下走。它缓存包绝对名称“TestFolder.os”,因为其他模块也会这样调用它。它将值设置为 None,以便其他模块的导入不必再次检查文件系统。
关于python - 奇怪的 Python 导入问题 - 内置函数的相对导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16570469/