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