【问题标题】:What is the priority of importing a name, submodule or subpackage from a package in python 2.7?在 python 2.7 中从包中导入名称、子模块或子包的优先级是什么?
【发布时间】:2014-09-26 04:07:29
【问题描述】:
在official Python 2 tutorial 中写道:
注意,当使用 from a_package import an_item 时,item 可以是包的子模块(或子包),也可以是包中定义的其他名称,如函数、类或变量.
那么如果a_package同时有一个名为an_item的子包、一个名为an_item的变量和一个名为an_item的模块呢?什么是优先事项?我做了一个实验,结果显示优先级为variable > subpackage > submodule,但我不确定这是否是python导入功能在所有情况下都遵循的规范顺序。
【问题讨论】:
标签:
python
python-2.7
import
python-internals
【解决方案1】:
您在问题confirms 中引用的下一句表示包中定义的名称(“变量”,使用您的措辞)优先于子模块/包:
import 语句首先测试项目是否在包中定义;如果不是,它假定它是一个模块并尝试加载它。
我在 Python 2.7 的文档中找不到明确的确认包优先于模块。我确实在PEP 420找到了这个:
在导入处理期间,导入机制将继续遍历父路径中的每个目录,就像在 Python 3.2 中一样。在为父路径中的每个目录查找名为“foo”的模块或包时:
- 如果找到
<directory>/foo/__init__.py,则导入并返回常规包。
- 如果没有,但找到
<directory>/foo.{py,pyc,so,pyd},则导入并返回一个模块。
... 虽然它只明确指出这是 Python 3.2 中的行为,但可以认为是暗示“...和以前版本的 Python”。这再次证实了您发现包优先于模块。
但是:依赖这个实现细节是一个可怕的想法。世界上知道它的人数可能不会超出 Python 的核心开发人员。就所有意图和目的而言,它都未记录在案,并且可能会导致极难追踪的错误。