【问题标题】: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 的核心开发人员。就所有意图和目的而言,它都未记录在案,并且可能会导致极难追踪的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-04
      • 2017-02-25
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多