繁体   English   中英

python中的绝对导入是什么?

[英]What is absolute import in python?

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

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

绝对{进口,路径,URL}告诉你究竟是如何得到你之后的事情,通常通过指定每一个部分:

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

相对 {imports, paths, URLs} 正是他们所说的:它们对于它们的当前位置。 也就是说,如果目录结构更改或文件移动,这些可能会中断(因为它们不再意味着相同的事情)。

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 变更日志令人困惑的措辞的讨论。 本质上,该指令的范围(以及 Python 中绝对导入和相对导入之间的扩展)非常非常狭窄。 如果您发现自己需要这些区别才能使您的代码正常工作,则最好尽可能重命名本地模块。

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

是: import os import sys

否: import sys, os

不过可以这么说:

from subprocess import Popen, PIPE Imports 总是放在文件的顶部,就在任何模块注释和文档字符串之后,以及模块全局变量和常量之前。

进口应按以下顺序分组:

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

根据 Pep8 :-建议使用绝对导入,因为如果导入系统配置不正确(例如当包内的目录最终出现在sys.path):

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

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

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 <module> import * ),因为它们使命名空间中存在哪些名称变得不清楚,使读者和许多自动化工具都感到困惑。 通配符导入有一个可防御的用例,即重新发布内部接口作为公共 API 的一部分(例如,使用可选加速器模块中的定义覆盖接口的纯 Python 实现以及哪些定义将被被覆盖是事先不知道的)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM