导入语句python3的更改

bal*_*lki 157 python python-3.x

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

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

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

Mic*_*rny 255

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

以下面的树为例:

mypkg
??? base.py
??? derived.py
Run Code Online (Sandbox Code Playgroud)

现在,你derived.py需要一些东西base.py.在Python 2中,您可以这样做(in derived.py):

from base import BaseThing
Run Code Online (Sandbox Code Playgroud)

Python 3不再支持它,因为它不明确你是否想要'相对'或'绝对' base.换句话说,如果base在系统中安装了一个名为Python的软件包,那么你就会得到错误的软件包.

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

from .base import BaseThing
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

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

def sin_degrees(x):
    from math import *
    return sin(degrees(x))
Run Code Online (Sandbox Code Playgroud)

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

a.py:1: SyntaxWarning: import * only allowed at module level
  def sin_degrees(x):
Run Code Online (Sandbox Code Playgroud)

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

def sin_degrees(x):
    from math import sin, degrees
    return sin(degrees(x))
Run Code Online (Sandbox Code Playgroud)

要么:

from math import *

def sin_degrees(x):
    return sin(degrees(x))
Run Code Online (Sandbox Code Playgroud)

  • 当运行“python衍生.py”时,这当然会失败 (2认同)

Bre*_*arn 14

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

至于import *,Python 2允许在函数内导入星号,例如:

>>> def f():
...     from math import *
...     print sqrt
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么做出这个决定? (6认同)
  • 不,实际上这是“对立”,“实用胜过纯洁”的决定。为了优化函数内部的局部变量访问,这是必需的,因为没有“ import *”,编译器始终仅通过分析代码就知道哪些变量是局部变量,并且可以直接查找。实际上,函数甚至不将dict用于本地存储,而是将变量获得唯一索引的优化数组。 (2认同)

Aks*_*lén 10

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

from .sister import foo
from . import brother
from ..aunt import bar
from .. import uncle
Run Code Online (Sandbox Code Playgroud)

  • import .brother在Python 3.5中给出了无效的语法错误.这个是正常的?我在它所在的目录中有_init_.py (14认同)
  • 来自.导入兄弟是py3k中的正确方法 (11认同)
  • `import .brother` 对于 python 2 和 3 都是无效语法 (2认同)

Pan*_* Li 5

为 Micha 添加了另一个案例?戈尔尼的回答:

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