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)
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中,不再允许它,你只能在模块的顶层进行星形导入(不在函数或类中).
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)
为 Micha 添加了另一个案例?戈尔尼的回答:
请注意,相对导入基于当前模块的名称。由于主模块的名称始终为“ __main__”,因此用作 Python 应用程序主模块的模块必须始终使用绝对导入。
| 归档时间: |
|
| 查看次数: |
104037 次 |
| 最近记录: |