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.pysquare.pytriangle.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,其中包含父级和子级之间的级别数。