[英]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.py
和somelib/__init__.py
然后尝试了以下
>>> from somelib import foo
in somelib/__init__.py
>>>
显然 python 更喜欢基于目录的模块而不是基于文件的模块
正如@scnerd 指出的那样,这可能是意外行为,但这是我在默认实现中看到的。
如果您想知道这是如何发生的,您可能会查看importlib以了解可怕的细节
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.