pep-0404我不明白以下内容
在Python 3中,包中的隐式相对导入不再可用 - 仅支持绝对导入和显式相对导入 . 此外,星型导入(例如来自x import *)仅允许在模块级代码中使用 .
什么是相对进口?在python2中允许星形导入的其他地方?请举例说明 .
无论何时导入相对于当前脚本/包的包,都会发生相对导入 .
例如,考虑以下树:
mypkg ├── base.py └── derived.py
现在,您的 derived.py 需要 base.py 的内容 . 在Python 2中,您可以这样做(在 derived.py 中):
derived.py
base.py
from base import BaseThing
Python 3不再支持它,因为它's not explicit whether you want the '相对' or '绝对' base . 换句话说,如果系统中安装了名为 base 的Python包,则会出错 .
base
相反,它要求您使用显式导入,它明确指定模块在路径上的位置 . 你的 derived.py 看起来像:
from .base import BaseThing
领先 . 说'从模块目录导入 base ';换句话说, .base 映射到 ./base.py .
.
.base
./base.py
类似地,有 .. 前缀,它在目录层次结构中上升,如 ../ ( ..mod 映射到 ../mod.py ),然后 ... 上升两级( ../../mod.py ),依此类推 .
..
../
..mod
../mod.py
...
../../mod.py
但请注意,上面列出的相对路径是相对于当前模块( derived.py )所在的目录,而不是当前工作目录 .
@BrenBarn已经解释了明星导入案例 . 为了完整,我将不得不说同样的;) .
例如,您需要使用一些 math 函数,但只能在单个函数中使用它们 . 在Python 2中,你被允许是半懒惰的:
math
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))
对于相对进口,请参见the documentation . 相对导入是指从模块导入相对于该模块的位置,而不是绝对来自 sys.path .
sys.path
对于 import * ,Python 2允许在函数内进行星型导入,例如:
import *
>>> def f(): ... from math import * ... print sqrt
在Python 2中发出了警告(至少是最新版本) . 在Python 3中,它不再被允许,您只能在模块的顶层(不在函数或类内)进行星型导入 .
要同时支持Python 2和Python 3,请使用如下的显式相对导入 . 它们与当前模块相关 . 他们得到了支持starting from 2.5 .
from .sister import foo from . import brother from ..aunt import bar from .. import uncle
为MichałGórny的回答增加了另一个案例:
请注意,相对导入基于当前模块的名称 . 由于主模块的名称始终为“ __main__ ”,因此用作Python应用程序主模块的模块必须始终使用绝对导入 .
__main__
4 回答
无论何时导入相对于当前脚本/包的包,都会发生相对导入 .
例如,考虑以下树:
现在,您的
derived.py
需要base.py
的内容 . 在Python 2中,您可以这样做(在derived.py
中):Python 3不再支持它,因为它's not explicit whether you want the '相对' or '绝对'
base
. 换句话说,如果系统中安装了名为base
的Python包,则会出错 .相反,它要求您使用显式导入,它明确指定模块在路径上的位置 . 你的
derived.py
看起来像:领先
.
说'从模块目录导入base
';换句话说,.base
映射到./base.py
.类似地,有
..
前缀,它在目录层次结构中上升,如../
(..mod
映射到../mod.py
),然后...
上升两级(../../mod.py
),依此类推 .但请注意,上面列出的相对路径是相对于当前模块(
derived.py
)所在的目录,而不是当前工作目录 .@BrenBarn已经解释了明星导入案例 . 为了完整,我将不得不说同样的;) .
例如,您需要使用一些
math
函数,但只能在单个函数中使用它们 . 在Python 2中,你被允许是半懒惰的:请注意,它已在Python 2中触发警告:
在现代Python 2代码中,您应该在Python 3中执行以下任一操作:
要么:
对于相对进口,请参见the documentation . 相对导入是指从模块导入相对于该模块的位置,而不是绝对来自
sys.path
.对于
import *
,Python 2允许在函数内进行星型导入,例如:在Python 2中发出了警告(至少是最新版本) . 在Python 3中,它不再被允许,您只能在模块的顶层(不在函数或类内)进行星型导入 .
要同时支持Python 2和Python 3,请使用如下的显式相对导入 . 它们与当前模块相关 . 他们得到了支持starting from 2.5 .
为MichałGórny的回答增加了另一个案例:
请注意,相对导入基于当前模块的名称 . 由于主模块的名称始终为“
__main__
”,因此用作Python应用程序主模块的模块必须始终使用绝对导入 .