AbsoluteRelative Imports
在 Python 3 中, PEP 404 改变了 Python 中的导入工作方式 2. 包中不再允许隐式相对导入,只允许在模块级代码中使用 from ... import *
导入。
要在 Python 2 中实现 Python 3 行为:
- 在绝对导入功能,可与
from __future__ import absolute_import
启用 - ** 鼓励明确的相对导入来代替隐含的相对导入
为了澄清,在 Python 2 中,模块可以导入位于同一目录中的另一个模块的内容,如下所示:
import foo
请注意,仅使用 import 语句,foo
的位置不明确。因此不鼓励这种类型的隐式相对导入支持显式相对导入 ,如下所示:
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path
dot .
允许在目录树中显式声明模块位置。
更多关于相对导入的信息
考虑一些名为 shapes
的用户定义包。目录结构如下:
shapes
├── __init__.py
|
├── circle.py
|
├── square.py
|
└── triangle.py
circle.py
,square.py
和 triangle.py
全部导入 util.py
作为模块。他们将如何引用同一级别的模块?
from . import util # use util.PI, util.sq(x), etc
要么
from .util import * #use PI, sq(x), etc to call functions
.
用于相同级别的相对导入。
现在,考虑一下 shapes
模块的替代布局:
shapes
├── __init__.py
|
├── circle
│ ├── __init__.py
│ └── circle.py
|
├── square
│ ├── __init__.py
│ └── square.py
|
├── triangle
│ ├── __init__.py
│ ├── triangle.py
|
└── util.py
现在,这 3 个类将如何引用 util.py?
from .. import util # use util.PI, util.sq(x), etc
要么
from ..util import * # use PI, sq(x), etc to call functions
..
用于父级相对导入。添加更多 .
s,其中包含父级和子级之间的级别数。