关于python:import语句python3中的更改

Changes in import statement python3

我不理解pep-0404的以下内容

In Python 3, implicit relative imports within packages are no longer
available - only absolute imports and explicit relative imports are
supported. In addition, star imports (e.g. from x import *) are only
permitted in module level code.

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


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

以下面的树为例:

1
2
3
mypkg
├── base.py
└── derived.py

现在,你的derived.py需要来自base.py的东西。在Python 2中,您可以这样做(在derived.py中):

1
from base import BaseThing

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

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

1
from .base import BaseThing

前导.表示来自模块目录的'import base;换句话说,.base映射到./base.py

类似地,有..前缀,它在目录层次结构中上升,如../(..mod映射到../mod.py),然后...上升两级(../../mod.py),依此类推。

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

@BrenBarn已经解释了明星进口案例。为了完整,我将不得不说同样的;)。

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

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

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

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

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

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

要么:

1
2
3
4
from math import *

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

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

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

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

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


要同时支持Python 2和Python 3,请使用如下的显式相对导入。它们与当前模块相关。从2.5开始支持它们。

1
2
3
4
from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle


为Micha增加了另一个案例? Górny的回答:

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