导入语句python3的更改

时间:2012-08-29 07:24:07

标签: python python-3.x

我不理解pep-0404

中的以下内容
  

在Python 3中,包中的隐式相对导入不再存在   可用 - 仅限绝对导入和显式相对导入   支持的。此外,星级导入(例如来自x import *)仅是   在模块级代码中允许。

什么是相对进口? 在python2中允许星形导​​入的其他地方? 请用例子说明。

4 个答案:

答案 0 :(得分:233)

无论何时导入相对于当前脚本/包的包,都会发生相对导入。

例如,考虑以下树:

mypkg
├── base.py
└── derived.py

现在,您的derived.py需要base.py的内容。在Python 2中,您可以这样做(在derived.py中):

from base import BaseThing

Python 3不再支持它,因为它不明确你是否想要'relative'或'absolute'base。换句话说,如果系统中安装了名为base的Python包,则会出错。

相反,它要求您使用显式导入,它在路径上明确指定模块的位置。您的derived.py看起来像是:

from .base import BaseThing

前导.说'从模块目录导入base';换句话说,.base映射到./base.py

同样,..前缀位于目录层次结构中,如../..mod映射到../mod.py),然后是...两级(../../mod.py)等等。

请注意,上面列出的相对路径是相对于当前模块(derived.py)所在的目录,不是当前工作目录。


@BrenBarn 已经解释了明星导入案例。为了完整起见,我将不得不说同样的事情;)。

例如,您需要使用一些math函数,但只能在单个函数中使用它们。在Python 2中,你被允许是半懒惰的:

def sin_degrees(x):
    from math import *
    return sin(degrees(x))

请注意,它已在Python 2中触发警告:

a.py:1: SyntaxWarning: import * only allowed at module level
  def sin_degrees(x):

在现代Python 2代码中,您应该在Python 3中执行以下任一操作:

def sin_degrees(x):
    from math import sin, degrees
    return sin(degrees(x))

或:

from math import *

def sin_degrees(x):
    return sin(degrees(x))

答案 1 :(得分:12)

对于相对导入,请参阅the documentation。相对导入是指从模块导入相对于该模块的位置,而不是绝对来自sys.path

对于import *,Python 2允许在函数中进行星型导入,例如:

>>> def f():
...     from math import *
...     print sqrt

在Python 2中发出警告(至少是最新版本)。在Python 3中,不再允许它,你只能在模块的顶层进行星形导入(而不是在函数或类中)。

答案 2 :(得分:9)

要同时支持Python 2和Python 3,请使用显式相对导入,如下所示。它们与当前模块相关。他们得到了支持starting from 2.5

from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle

答案 3 :(得分:2)

在MichałGórny的回答中添加了另一个案例:

请注意,相对导入基于当前模块的名称。由于主模块的名称始终为“ __main__”,因此打算用作Python应用程序主模块的模块必须始终使用绝对导入。