python中的绝对导入是什么?

python中的绝对导入是什么?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我是Python新手。我正在开发一个小项目。从病房开始,我需要遵循编码标准。如何正确使用import语句。现在我正在研究Python2.7。如果我转到3.x,是否与绝对导入有冲突?绝对导入和相对导入之间的区别是什么?此处绘制的绝对导入和相对导入之间的区别与我们谈论绝对和相对文件路径甚至URL的方式非常相似 绝对的{import,path,URL}告诉您确切地如何获得您想要的东西,通常是通过指定每个部分: import os, sys from datetime import datetime f

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

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

绝对的{import,path,URL}告诉您确切地如何获得您想要的东西,通常是通过指定每个部分:

import os, sys
from datetime import datetime
from my_package.module import some_function
相对{imports,path,url}正是它们所说的:它们与当前位置相对。也就是说,如果目录结构更改或文件移动,这些可能会中断(因为它们不再意味着相同的事情)

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


在评论中,我被要求提供一个示例,说明如何从未来导入绝对导入,以及如何使用它。在试图表述这个例子时,我意识到我也不能很好地解释它的行为,所以我。给出了一个代码示例,显示了来自uuu future uuuuu import absolute u import
的〈代码〉的正确工作实现,实际解决了歧义


详细介绍了为什么会这样,包括讨论Python 2.5变更日志中令人困惑的措辞。本质上,该指令的范围(以及Python中绝对导入和相对导入之间的扩展区别)非常非常狭窄。如果您发现自己需要这些区别以使代码正常工作,则最好尽可能重命名本地模块。

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

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

否:
导入系统、操作系统

不过可以这么说:

从子流程导入Popen,管道
导入总是放在文件的顶部,就在任何模块注释和docstring之后,模块全局变量和常量之前

导入应按以下顺序分组:

  • 标准库导入
  • 相关第三方进口
  • 本地应用程序/库特定导入
  • 您应该在每组导入之间放置一个空行
根据Pep8:- 建议绝对导入,因为如果导入系统配置不正确(例如当包中的目录位于sys.path上时),绝对导入通常更具可读性,并且往往表现更好(或至少提供更好的错误消息):

但是,显式相对导入是绝对导入的可接受替代方案,特别是在处理复杂的包布局时,使用绝对导入会导致不必要的冗长:

from . import sibling
from .sibling import example
标准库代码应避免复杂的包布局,并始终使用绝对导入

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

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

from myclass import MyClass
from foo.bar.yourclass import YourClass
如果此拼写导致本地名称冲突,请明确拼写:

import myclass
import foo.bar.yourclass
使用“myclass.myclass”和“foo.bar.yourclass.yourclass”

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


你能澄清什么是绝对进口和相对进口吗?@Ol'Reliable中描述了它们。这也是我的想法。但是如果是这样的话,当我有来自未来的导入(绝对导入)
时,为什么后一种形式的导入仍然有效?@raxacoricofallapatorius说您有一个名为
字符串的本地模块。您打开一个解释器并发出
导入字符串
。Python 2.5将为您提供本地模块。Python 2.7+将为您提供该库。该未来指令将Python2.5转换为2.7默认行为。虚线形式是显式相对的,因此标准库不可能存在歧义。因此,它们总是工作相同。啊,我明白了,
来自未来绝对导入的
禁止隐式相对导入(显式导入可以)。对吗?@Raxacoricocfallapatorius我认为在这个指令下,即使是含蓄的也可以。它所做的只是使Python在发生冲突时更喜欢绝对版本——当导入语句可以有效地解释为相对(本地模块)或绝对(标准库)时。换句话说,通过在
sys.path
上创建同名目录,它可以防止您意外地掩盖Python标准库的某些部分,类似于命名变量
list
的方式会使内置的
list
函数黯然失色。@raxacoricofallapatorius我安装了Python 2.5来测试这一点,并可能编写了一个示例,结果证明我并不像我想象的那样清楚或确定发生了什么。我已经了解了您可能感兴趣的这个特定行为;mylog.warning\u日志('oops')
from myclass import MyClass
from foo.bar.yourclass import YourClass
import myclass
import foo.bar.yourclass