当你在一个软件包中进行导入时,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会这样做?也许只是因为它再也不会检查那些位置的库?
答案 0 :(得分:1)
缓存包括未命中和命中。 TestFolder.os == None只是意味着python寻找一个名为“os”的包相关模块,没有找到它,然后继续行。它缓存包绝对名称“TestFolder.os”,因为这是其他模块所称的。它将值设置为None,以便其他模块的导入不必再次检查文件系统。