什么是python中的绝对导入?

What is absolute import in python?

我是Python的新手。我正在开发一个小项目。我需要从病房开始遵循编码标准。如何正确使用import语句。现在我正在开发Python2.7。如果我移到3.x,是否与绝对进口有冲突?绝对进口和相对进口有什么区别?


这里描述的absoluterelative之间的区别与我们讨论绝对和相对文件路径甚至URL的方式非常相似。

绝对导入、路径、URL告诉您如何确切地获得所需的内容,通常通过指定每个部分:

1
2
3
import os, sys
from datetime import datetime
from my_package.module import some_function

相对导入、路径、URL正是它们所说的:它们与当前位置相关。也就是说,如果目录结构更改或文件移动,这些可能会中断(因为它们不再意味着相同的事情)。

1
2
from .module_in_same_dir import some_function
from ..module_in_parent_dir import other_function

因此,对于将要共享的代码,首选绝对导入。

我被要求在评论中提供一个例子,说明from __future__ import absolute_import是如何与这个联系起来的,以及它是如何被使用的。在试图阐述这个例子时,我意识到我也不能很好地解释它的行为,所以我问了一个新问题。这个答案给出了一个代码示例,显示了from __future__ import absolute_import的正确工作的实现,它实际上解决了一个歧义。

接受的答案更详细地解释了为什么它是这样工作的,包括讨论了python 2.5 changelog中令人困惑的措辞。从本质上讲,这个指令的范围(以及通过扩展,python中绝对导入和相对导入之间的区别)非常非常狭窄。如果您发现自己需要这些区别来使代码正常工作,那么最好尽可能重命名本地模块。


进口通常应在单独的行上:

是:导入操作系统导入系统

否:导入系统,操作系统

但可以这样说:

从子进程导入popen,pipe导入总是放在文件的顶部,在任何模块注释和docstring之后,以及模块全局和常量之前。

导入应按以下顺序分组:

标准库导入。相关第三方进口。本地应用程序/库特定的导入。您应该在每组导入之间加一个空白行。

根据PEP8:建议使用绝对导入,因为如果导入系统配置不正确(例如包中的目录以sys.path结尾),绝对导入通常可读性更强,并且往往表现更好(或至少给出更好的错误消息):

导入mypkg.sibling从mypkg导入同级来自mypkg.sibling导入示例但是,显式相对导入是绝对导入的可接受替代方法,特别是在处理复杂的包布局时,使用绝对导入将不必要地冗长:

从。导入同级从.sibling导入示例标准库代码应避免复杂的包布局,并始终使用绝对导入。

隐式相对导入不应使用,并且已在python 3中删除。

从包含模块的类导入类时,通常可以拼写如下:

从MyClass导入MyClass从foo.bar.yourclass导入您的rclass如果此拼写导致本地名称冲突,则显式拼写:

导入MyClass导入foo.bar.yourclass用"myclass.myclass"和"foo.bar.yourclass.yourclass"。

应该避免使用通配符导入(从import*),因为它们使名称空间中存在的名称变得不清楚,从而混淆了读卡器和许多自动化工具。通配符导入有一个可防御的用例,即将内部接口重新发布为公共API的一部分(例如,用可选加速器模块中的定义覆盖接口的纯Python实现,并且确切地说哪些定义将被覆盖还不得而知)。

https://www.python.org/dev/peps/pep-0008/导入