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