相對或者絕對import
更多的復雜部分已經從python2.5以來實現:導入一個模塊可以指定使用絕對或者包相對的導入。這個計劃將移動到使絕對的導入成為默認的細節在其他版本的python中。
我們假設你有一個包目錄,像下面這樣:
1
2
3
4
|
pkg/ pkg/__init__.py pkg/main.py pkg/string.py |
上面定義了一個包稱為 pkg 包含 pkg.main 和pkg.string 兩個子模塊。考慮在‘main.py'中的代碼,什么事情會發生如果我們執行語句 import string 在python2.4或者更早的版本?他將會查詢包的目錄執行一個相對的import,找到pkg/string.py ,導入文件的內容作為pkg.string模塊,這個模塊的邊界的名字是'string'在pkg.main模塊中的名稱空間。
如果pkg.string是你想要的這個非常不錯。但是如果你僅僅想要的是python的基本的string模塊?
沒有清楚的方法忽略pkg.string以及尋找基本的模塊;一般情況下你不得不去查看sys.modules中的內容,那有一點稍微的不清楚。Holger Krekel的py.std包提供了一個整齊的方法執行從基本庫中導入的方法,improt py;py.std.string.jion(),但是那個包在python的安裝過程是是不可用的。
閱讀代碼在相對導入方面也是不夠清晰的,因為讀者可能混淆string和pkg.string模塊使用。Python用戶可以馬上知道那是不同的名稱在基本庫和自己的包模塊之間,但是你不能保護你自己的子模塊名字在一個新版本的python中。
從python2.5,你可以打開 import的行為直接去絕對導入使用一個 from __future__ import absolute_import 。這個絕對導入行為將成為一個默認的細節在將來的python中。一旦絕對導入被默認,import string 將總是尋找基本庫。建議用戶盡可能多的使用絕對導入,因此在你的代碼中使用from pkg improt string是適宜的。在python2.*版本中需要:
1
|
from __future__ import absolute_import |
示例1:
例如:在模塊A.B.C中的代碼:
1
2
3
|
from . import D # 導入A.B.D from .. import E # 導入A.E from ..F import G # 導入A.F.G,.. 和 F是連著的,中間沒有空格 |
.代表當前目錄,..代表上一層目錄,...代表上上層目錄。
示例2:
目錄結構:
1
2
3
4
5
6
7
8
9
10
|
package/ __init__.py subpackage1/ __init__.py moduleX.py moduleY.py subpackage2/ __init__.py moduleZ.py moduleA.py |
在subpackage1/moduleX.py 或者 subpackage1/__init__.py中可以這樣導入module:
1
2
3
4
5
6
7
8
|
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 |
注意,from ...sys import path是合法的,但是不建議。直接from sys import path就行了。