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

5
Python 2官方教程中提到:

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

那么如果a_package同时拥有名为an_item的子包、变量和模块,会发生什么呢?优先级是什么?我进行了一次实验,结果显示优先级为variable > subpackage > submodule,但我不确定这是否是Python导入功能在所有情况下遵循的规范顺序。
1个回答

8
在你引用的问题后面,下一句话证实,在包中定义的名称(使用你的措辞,“变量”)优先于子模块/包:

导入语句首先测试该项是否在包中定义;如果没有,则假定它是一个模块并尝试加载它。

我找不到Python 2.7文档中明确确认包优先于模块的内容。我在PEP 420中找到了这个:

在导入处理期间,导入机制将继续像在Python 3.2中一样迭代父路径中的每个目录。 在查找名为“foo”的模块或包时,对于父路径中的每个目录:

  • 如果找到<directory>/foo/__init__.py,则将导入并返回常规包。
  • 如果没有找到,但找到<directory>/foo.{py,pyc,so,pyd},则将导入并返回模块。
虽然它只明确声明这是Python 3.2的行为,但可以理解为“...以及Python的早期版本”。再次证实了你的结论,即包优先于模块。 但是:依赖于这个实现细节会是一个糟糕的主意。世界上知道它的人数可能不超过Python核心开发者;它基本上没有记录,并可能导致极难跟踪的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接