W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
將代碼組織成包,想用import語句從另一個包名沒有硬編碼過的包的中導(dǎo)入子模塊。
使用包的相對導(dǎo)入,使一個的模塊導(dǎo)入同一個包的另一個模塊 舉個例子,假設(shè)在你的文件系統(tǒng)上有mypackage包,組織如下:
mypackage/
__init__.py
A/
__init__.py
spam.py
grok.py
B/
__init__.py
bar.py
如果模塊mypackage.A.spam要導(dǎo)入同目錄下的模塊grok,它應(yīng)該包括的import語句如下:
# mypackage/A/spam.py
from . import grok
如果模塊mypackage.A.spam要導(dǎo)入不同目錄下的模塊B.bar,它應(yīng)該使用的import語句如下:
# mypackage/A/spam.py
from ..B import bar
兩個import語句都沒包含頂層包名,而是使用了spam.py的相對路徑。
在包內(nèi),既可以使用相對路徑也可以使用絕對路徑來導(dǎo)入。 舉個例子:
# mypackage/A/spam.py
from mypackage.A import grok # OK
from . import grok # OK
import grok # Error (not found)
像mypackage.A這樣使用絕對路徑名的不利之處是這將頂層包名硬編碼到你的源碼中。如果你想重新組織它,你的代碼將更脆,很難工作。 舉個例子,如果你改變了包名,你就必須檢查所有文件來修正源碼。 同樣,硬編碼的名稱會使移動代碼變得困難。舉個例子,也許有人想安裝兩個不同版本的軟件包,只通過名稱區(qū)分它們。 如果使用相對導(dǎo)入,那一切都o(jì)k,然而使用絕對路徑名很可能會出問題。
import語句的?<span class="pre" style="box-sizing: border-box;">.</span>
?和?``..``看起來很滑稽, 但它指定目錄名.為當(dāng)前目錄,..B為目錄../B。這種語法只適用于import。 舉個例子:
from . import grok # OK
import .grok # ERROR
盡管使用相對導(dǎo)入看起來像是瀏覽文件系統(tǒng),但是不能到定義包的目錄之外。也就是說,使用點的這種模式從不是包的目錄中導(dǎo)入將會引發(fā)錯誤。
最后,相對導(dǎo)入只適用于在合適的包中的模塊。尤其是在頂層的腳本的簡單模塊中,它們將不起作用。如果包的部分被作為腳本直接執(zhí)行,那它們將不起作用 例如:
% python3 mypackage/A/spam.py # Relative imports fail
另一方面,如果你使用Python的-m選項來執(zhí)行先前的腳本,相對導(dǎo)入將會正確運行。 例如:
% python3 -m mypackage.A.spam # Relative imports work
更多的包的相對導(dǎo)入的背景知識,請看?PEP 328?.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: