例如,有一些文件夹:
file_a.py
其中from file_b import some_function
有类似的内容:
r010
我知道这绝对不是好习惯,但落后的决议顺序是什么?
即。 python如何决定为“绝对导入”导入哪个模块?
答案 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.py
和somelib/__init__.py
然后尝试了以下
>>> from somelib import foo
in somelib/__init__.py
>>>
显然python更喜欢基于目录的模块到基于文件的模块
正如@scnerd所指出的,这可能是偶然的行为,但这是我在默认实现中看到的。
如果您想知道这是如何发生的,您可能会审核importlib以获取可怕的详细信息