python - 奇怪的 Python 导入问题 - 内置函数的相对导入?

标签 python import

当你在包内导入时,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/

相关文章:

Python 导入错误 : 'module' object has no attribute 'x'

postgresql - (PostgreSQL) 当 "column"中的所有日期都是来自另一个表的引用(外键)时,从 CSV 复制

python - 更改 networkx 图中节点的顺序/位置

url - 如何在 Sass 中使用 @use 谷歌字体 URL?

python - Python在点上分割字符串,后跟空白

python - 尝试为非我所有的视频删除YouTube统计信息。 python

mysql - SQL CSV 跨表导入/导出发布数据

mysql - 先前答案的所有应用程序都会失败 -#1062 - key '1' 的重复条目 'primary'

python - 使用 python 日志记录包,如何将额外的格式插入到具有自己的格式化程序的多个记录器处理程序中?

python - 在tensorflow中初始化变量、变量范围和import_graph_def