什么是python中的绝对导入?

时间:2014-03-27 05:21:56

标签: python python-2.7 python-3.x

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

2 个答案:

答案 0 :(得分:26)

此处绘制的absoluterelative之间的区别与我们讨论绝对和相对文件路径甚至URL的方式非常相似。

绝对{导入,路径,网址}告诉您完全如何获取您所追求的东西,通常是指定每个部分:

import os, sys
from datetime import datetime
from my_package.module import some_function

相对{导入,路径,网址}正是他们所说的:他们相对到他们当前的位置。也就是说,如果目录结构发生变化或文件移动,这些可能会中断(因为它们不再意味着相同的事情)。

from .module_in_same_dir import some_function
from ..module_in_parent_dir import other_function

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


我在评论中被要求提供一个示例,说明from __future__ import absolute_import如何与此相关联,以及如何使用它。在试图制定这个例子时,我意识到我无法解释它的行为,所以我asked a new questionThis answer提供了一个代码示例,展示了from __future__ import absolute_import的正确工作实现,它实际上解决了歧义。

The accepted answer详细介绍了为什么它的工作原理,包括讨论Python 2.5更改日志的混乱措辞。从本质上讲,该指令的范围(以及扩展Python中绝对和相对导入的区别)非常非常狭窄。如果你发现自己需要这些区别来使你的代码工作,那么你可能最好尽可能重命名本地模块。

答案 1 :(得分:0)

导入通常应放在单独的行上:

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

否:import sys,os

可以这样说:

从子流程导入Popen,PIPE 导入总是放在文件的顶部,在任何模块注释和文档字符串之后,在模块全局变量和常量之前。

进口应按以下顺序分组:

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

根据Pep8:- 建议绝对导入,因为如果导入系统配置不正确(例如,程序包中的目录结束时),它们通常更具可读性,并且通常表现更好(或至少会提供更好的错误消息)取决于sys.path):

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

来自。进口同胞 从.sibling导入示例 标准库代码应避免复杂的程序包布局,并始终使用绝对导入。

永远不要使用隐式相对导入,并且在Python 3中已将其删除。

从包含类的模块导入类时,通常可以这样:

从myclass导入MyClass 从foo.bar.yourclass导入YourClass 如果此拼写引起本地名称冲突,则应明确拼写它们:

导入myclass 导入foo.bar.yourclass 并使用“ myclass.MyClass”和“ foo.bar.yourclass.YourClass”。

应避免通配符导入(从import *导入),因为通配符使不清楚名称空间中存在哪些名称,从而使读者和许多自动化工具感到困惑。通配符导入有一个合理的用例,它是将内部接口重新发布为公共API的一部分(例如,用可选的加速器模块中的定义覆盖接口的纯Python实现,以及确切的定义是覆盖未知)。

https://www.python.org/dev/peps/pep-0008/#imports