在official Python 2 tutorial中说:
请注意,当使用 from a_ageage import an_item 时,该项可以是包的子模块(或子包),也可以是包中定义的其他名称,如函数,类或变量
那么如果a_package
有一个名为an_item
的子包,一个名为an_item
的变量和一个名为an_item
的模块,该怎么办?什么是优先事项?我做了一个实验,结果显示优先级为variable
> subpackage
> submodule
,但我不确定这是否是python导入功能在所有情况下遵循的规范顺序。
答案 0 :(得分:8)
在您的问题confirms中引用的一个句子之后的下一句,即在一个包中定义的名称("变量",以使用您的措辞)优先于子模块/包:
import
语句首先测试该项是否在包中定义;如果没有,它会假定它是一个模块并尝试加载它。
我无法在Python 2.7的文档中找到明确的确认,即包优先于模块。我确实在PEP 420中找到了这个:
在导入处理期间,导入机制将继续迭代父路径中的每个目录,就像在Python 3.2中一样。在为父路径中的每个目录查找名为" foo"的模块或包时:
- 如果找到
<directory>/foo/__init__.py
,则会导入并返回常规包。- 如果没有,但找到了
<directory>/foo.{py,pyc,so,pyd}
,则导入并返回一个模块。
...虽然它只是明确地声明这是Python 3.2中的行为,但可以暗示&#34; ...以及以前版本的Python&#34;。同样,这证实了您发现包装优先于模块。
但是:依赖此实现细节会是一个糟糕的想法。世界上知道它的人数可能远远超出了Python的核心开发人员;所有意图和目的都是无证的,并且容易造成极难追踪的错误。