什么是python中的绝对导入?

Shi*_*iva 15 python python-2.7 python-3.x

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

Two*_*ist 26

这里absolute和之间的区别relative非常类似于我们讨论绝对和相对文件路径甚至URL的方式.

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

import os, sys
from datetime import datetime
from my_package.module import some_function
Run Code Online (Sandbox Code Playgroud)

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

from .module_in_same_dir import some_function
from ..module_in_parent_dir import other_function
Run Code Online (Sandbox Code Playgroud)

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


我在评论中被要求提供一个如何from __future__ import absolute_import与此联系以及如何使用它的示例.在试图制定这个例子时,我意识到我也无法解释它的行为,所以我问了一个新问题.这个答案给出了一个代码示例,显示了一个正确工作的实现from __future__ import absolute_import,它实际上解决了歧义.

接受的答案更详细地说明了为什么它的工作方式,包括讨论Python 2.5更改日志的令人困惑的措辞.从本质上讲,该指令的范围(以及扩展Python中绝对和相对导入的区别)非常非常狭窄.如果您发现自己需要这些区别来使代码正常工作,那么如果可能的话,最好重命名本地模块.

  • @raxacoricofallapatorius假设你有一个名为`string`的本地模块.你打开一个解释器并发出`import string`.Python 2.5会为您提供本地模块.Python 2.7+会为您提供[string](https://docs.python.org/2/library/string.html)库.未来的指令将Python 2.5转换为2.7默认行为.虚线形式是明确相对的,因此标准库不存在歧义.因此,他们总是一样的.[详细](https://docs.python.org/2.5/whatsnew/pep-328.html) (2认同)
  • @raxacoricofallapatorius我认为即使是隐含的也可以在该指令下使用.它所做的就是让Python在发生冲突时更喜欢绝对版本 - 当import语句可以有效地被解释为相对(本地模块)或绝对(标准库)时.换句话说,它可以通过在同一名称的`sys.path`上创建目录来防止意外地掩盖Python标准库的某些部分,类似于命名变量`list`掩盖内置`list`函数的方式. (2认同)