了解已知 Python 包中的导入语句

节叶小门

我创建的一些小项目具有以下目录结构:

my_project/
  ├─ docs/
  ├─ code/
  │    ├─ __init__.py
  │    ├─ main.py
  │    └─ tools.py
  ├─ README
  └─ .gitignore

并在main.py我使用以下绝对导入语句tool()tools.py模块导入函数

from tools import tool

当我查看一些众所周知的(可能也写得很好)包的源代码时,我发现了一个类似的结构,但绝对导入语句的风格不同:

( Django , /django/core/paginator.py)

from django.utils.functional import cached_property
from django.utils.inspect import method_has_no_args

为什么django导入语句中包含目录?它是如何导入模块的首选方式?当我将逻辑应用于我的项目并tool()像这样更改函数的导入时

from code.tests import test

然后在终端中运行以下命令:

python3 main.py

ModuleNotFoundError当然提出了

我想了解为什么这些包使用这种样式的导入语句(这与我的不同,不适用于我自己的项目)。我仍在学习 Python,因此也非常感谢一些要阅读的链接。

抽烟

它不是像您假设的那样引用本地目录,而是引用其安装路径中的实际模块本身。

安装模块后,Python 解释器可以访问django因为它基本上是在引用模块的安装位置。解释基本上是在尝试做:

  1. django我当前的工作目录中路径吗?
  2. 如果没有,是否有django我可以在我的环境路径中引用的路径?
  3. 如果没有,抛出一个ModuleNotFoundError.

按照此逻辑,包使用绝对导入,因为paginator.py位于django/core路径中,因此无法访问django/utils路径,除非它直接将自身引用为来自site-packages或使用相对导入(from ..utils.functional import cached_property等)的已安装模块此链接有更多详细信息。

要将您的情况下的苹果与苹果进行比较 - 尝试test.pymy_project/utils. 您会注意到如果main.py没有绝对或相对导入,您将无法访问该模块,因为 Python 解释器只知道您当前的工作目录(core,假设您main.py直接运行,或者您实际执行解释器的任何位置)和任何其他模块目录可通过您的环境路径访问。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章