在python 2.7中从包导入名称,子模块或子包的优先级是什么?

时间:2014-09-26 04:07:29

标签: python python-2.7 import python-internals

official Python 2 tutorial中说:

  

请注意,当使用 from a_ageage import an_item 时,该项可以是包的子模块(或子包),也可以是包中定义的其他名称,如函数,类或变量

那么如果a_package有一个名为an_item的子包,一个名为an_item的变量和一个名为an_item的模块,该怎么办?什么是优先事项?我做了一个实验,结果显示优先级为variable> subpackage> submodule,但我不确定这是否是python导入功能在所有情况下遵循的规范顺序。

1 个答案:

答案 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的核心开发人员;所有意图和目的都是无证的,并且容易造成极难追踪的错误。