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,其中包含父級和子級之間的級別數。