python - 模块的导入顺序

时间:2018-03-12 16:21:40

标签: python python-import

例如,有一些文件夹:

file_a.py

其中from file_b import some_function 有类似的内容:

r010

我知道这绝对不是好习惯,但落后的决议顺序是什么?

即。 python如何决定为“绝对导入”导入哪个模块?

3 个答案:

答案 0 :(得分:5)

我不确定此信息在文档中的位置(或是否) - 快速检查import system docs没有将其打开 - 但PEP 420说明如下:

  

为每个目录寻找名为“foo”的模块或包   在父路径中:

     
      
  • 如果找到<directory>/foo/__init__.py,则会导入并返回常规包。
  •   
  • 如果没有,但找到<directory>/foo.{py,pyc,so,pyd},则会导入并返回模块。扩展名的确切列表因平台而异   以及是否指定了-O标志。这里的清单具有代表性。
  •   
  • 如果没有,但找到<directory>/foo并且是一个目录,则会记录该目录并继续扫描父目录中的下一个目录   路径。
  •   
  • 否则,扫描将继续执行父路径中的下一个目录。
  •   
     

如果扫描完成而没有返回模块或包,并且在   记录了至少一个目录,然后创建了一个命名空间包。

因此,根据PEP 420,如果在同一目录中找到一个包和一个非包模块,则该包将获胜。

答案 1 :(得分:2)

基于@JonKiparsky的建议,我挖了一下importlib,最后找到了Writing Your Own Yeoman Generator docs,它确实在查找符合包名的有效文件之前显式检查了一个目录。很高兴看到@ user2357112的答案,这应该是定义的行为,而不仅仅是偶然事件。

答案 2 :(得分:1)

我做了一个小实验,somelib.pysomelib/__init__.py 然后尝试了以下

>>> from somelib import foo
in somelib/__init__.py
>>>

显然python更喜欢基于目录的模块到基于文件的模块

正如@scnerd所指出的,这可能是偶然的行为,但这是我在默认实现中看到的。

如果您想知道这是如何发生的,您可能会审核importlib以获取可怕的详细信息