1

当您查看 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 为无。但为什么它首先存在呢?为什么模块列表会注册一个在查找时已被证明不存在的模块?我假设发生这种情况是因为系统首先在 TestFolder 中检查“os”库(因此是 TestFolder.os),然后在内置程序中查找。为什么仅仅因为你检查了就添加一个条目?有谁知道为什么 Python 会这样做?也许只是因为它不再检查这些位置的库?

4

1 回答 1

1

缓存包括未命中和命中。TestFolder.os==None 只是意味着 python 寻找一个名为“os”的包相关模块,没有找到它,然后继续下线。它缓存包的绝对名称“TestFolder.os”,因为其他模块会这样称呼它。它将值设置为 None 以便其他模块的导入不必再次检查文件系统。

于 2013-05-15T16:50:01.813 回答