Python导入优先级:包还是模块?

发布于 2021-01-29 18:34:25

我不清楚如何正确命名这个问题。

情况1

假设我具有以下目录结构。

foo
|
+- bar/__init__.py
|
+- bar.py

如果我有

from foo import bar

我如何知道要导入哪个条(bar.pybar/__init__.py)?有没有简单的方法可以自动检测到这种情况?

情况二

foo
|
+- foo.py
|
+- other.py

如果other.py有这一行

import foo

我如何知道要导入哪个foo(foo或foo.foo)?再次,这是否是一种简单的方法来自动检测到这种情况?

关注者
0
被浏览
53
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    TLDR;如果程序包位于同一目录中,则它们优先于相同名称的模块。

    从文档:

    “当spam导入一个名为的模块时,解释器会spam.py在当前目录中搜索一个文件,然后在环境变量指定的目录列表中搜索PYTHONPATH。这具有与shell变量PATH相同的语法,即目录名称。”

    这有点误导,因为解释器还会寻找一个名为的包spam(一个spam包含__init__.py文件的目录)。由于目录条目是在搜索之前进行排序的,因此,如果程序包位于同一目录中,则它们优先于具有相同名称的模块,因为它们位于spam之前spam.py

    请注意,“当前目录”是相对于主脚本路径(where __name__ == '__main__' is True)。因此,如果您正在/home/billg通话/foo/bar.py,则“当前目录”是指/foo



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看