繁体   English   中英

python - 模块的导入顺序

[英]python - order of import for modules

例如有一些文件夹:

.
├── file_a.py
├── file_b
│   └── __init__.py
└── file_b.py

其中file_a.py具有以下内容:

from file_b import some_function

我知道这绝对不是一个好习惯,但是后面的解析顺序是什么?

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

我不确定此信息在文档中的何处(或是否) - 快速检查导入系统文档并没有显示它 - 但PEP 420说明如下:

在查找名为“foo”的模块或包时,对于父路径中的每个目录:

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

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

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

根据@JonKiparsky 的建议,我对 importlib 进行了一些挖掘,最后找到了importlib._bootstrap.FileFinder.find_spec ,它确实在查找适合包名称的有效文件之前明确检查了目录。 不过,很高兴看到 @user2357112 的回答,这应该是定义的行为,而不仅仅是偶然事件。

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

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

显然 python 更喜欢基于目录的模块而不是基于文件的模块

正如@scnerd 指出的那样,这可能是意外行为,但这是我在默认实现中看到的。

如果您想知道这是如何发生的,您可能会查看importlib以了解可怕的细节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM