我对 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/