python - 导入表达式的差异?

标签 python django

我对 python 中的 import//from 语句有疑问。

在我的views.py文件(Project/App/views.py)中我有这一行:

from django.views.generic import TemplateView, ListView

为什么我必须在该行中包含“django”?为什么指定通用文件所在的目录( View )还不够?这是我在之前的许多仅使用 python 的脚本中所做的 - 一个例子是:

from random import foo

以及我当前的 django url.py 文件。在那里,我有:

from app.views import view

为什么我不必进一步指定,就像第一个示例中“django”包含在路径规范中一样?为什么我不必这样写:

from project.app.views import view

谢谢!

最佳答案

欢迎来到 Python 导入系统的狂野世界!

为了稍微扩展 freude 的答案,您遇到了 Python 语言中最令人困惑的部分之一:相对导入与绝对导入。虽然您提供的导入示例在语法上很好,但它们隐藏了幕后发生的一些复杂性。当你运行时:

from django.views.generic import TemplateView, ListView

Python 在 PYTHONPATH(您可以使用 print(sys.path) 等命令查看)中搜索名为 django 的包或模块。它最终会在您安装的库中找到一个。同样,当您运行时:

from project.app.views import view 

它会搜索这些相同路径,而是在 Python 解释器当前正在执行的目录中查找项目包。但是,如果您安装了名为的库项目,它怎么知道你真正指的是哪一个?这通常可以通过使用绝对导入来解决,如果您打算使用这样的相对导入,则可以通过明确地解决。如果您想在示例中更精确,您可以指定您希望使用 . 将其相对导入到当前模块 - 如下所示:

from .project.app.views import view    

您甚至可以在 django tutorial 中的示例中看到此操作的实际效果。 .

参见this classic answer有关该主题的更多详细信息。

关于python - 导入表达式的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48197857/

相关文章:

python - 使用 join() 的方法的空间复杂度

Django Multiselect,如何正确覆盖选择

Django localflavor 模型?默认小部件?

python - Django,如何通过模型字段访问模型内​​部的模型

python - Sorl-缩略图 : Clear cache of only one image?

python - Django:如何在其自身内部调用相同的模型类?

python - 将 Wagtail 与 Django 管理集成

python - 如何使用 Python 将多个 Excel 工作表从网站下载到 Pandas DataFrame 中

python - Scikit 学习 : Cross validation and Confidence Intervals

Django UNIQUE 约束失败 : core_organization. 名称