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 |
现在,你的
1 | from base import BaseThing |
Python 3不再支持它,因为它不明确你是否想要'relative'或'absolute'
相反,它要求您使用显式导入,它明确指定模块在路径上的位置。你的
1 | from .base import BaseThing |
前导
类似地,有
但请注意,上面列出的相对路径是相对于当前模块(
@BrenBarn已经解释了明星进口案例。为了完整,我将不得不说同样的;)。
例如,您需要使用一些
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)) |
有关相关导入,请参阅文档。相对导入是指从模块导入相对于该模块的位置,而不是绝对来自
对于
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的回答:
请注意,相对导入基于当前模块的名称。由于主模块的名称始终为"