python的__init__.py文件

每當(dāng)我想搞透一個(gè)東西的時(shí)候隘竭,我就會(huì)寫篇文章。OK讼渊,今天的主題就是這個(gè)__init__文件动看。
關(guān)于這個(gè)文件,問題無非是三個(gè)爪幻,是什么菱皆,為什么,怎么用挨稿。

是什么- python包管理

這個(gè)問題的核心在于python的包管理仇轻。
python使用包來組織模塊的命名空間。A.B表名在A包中的B模塊奶甘。主要用來解決全局變量名稱沖突的問題拯田。

為什么

來看一個(gè)典型的項(xiàng)目結(jié)構(gòu):

image.png

在導(dǎo)入一個(gè)包的時(shí)候,python搜索所有sys.path下面的目錄甩十。__init__.py文件用來告訴python,這個(gè)目錄是一個(gè)python包。
這個(gè)機(jī)制防止某些通用名字的目錄吭产,例如string侣监,和后續(xù)加載的實(shí)際可能的模塊名發(fā)生沖突。

怎么用

import語句

最簡單的情況下臣淤,__init__.py文件可以是空的橄霉。也可以執(zhí)行初始化代碼,或者設(shè)置__all__變量邑蒋。

包的用戶可以導(dǎo)入包中的單獨(dú)的某個(gè)模塊姓蜂,例如:
import sound.effcts.echo
這會(huì)加載子模塊sound.effcts.echo,使用時(shí)必須使用全名:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

另外一種導(dǎo)入包的方式是:
from sound.effects import echo
這也會(huì)加載子模塊echo, 使用時(shí)不需要使用全名:
echo.echofilter(input, output, delay=0.7, atten=4)

也可以直接導(dǎo)入某個(gè)函數(shù):
from sound.effects.echo import echofilter
這會(huì)加載子模塊echo医吊,但是函數(shù)echofilter()直接可用:
echofilter(input, output, delay=0.7, atten=4)

在使用from package import item語法時(shí)钱慢,item可以是package的子模塊、子包或者任何定義在packge里的名字卿堂。例如一個(gè)函數(shù)束莫、類或變量懒棉。import聲明首先假設(shè)item是package里定義的,如果不是览绿,會(huì)假設(shè)他是一個(gè)模塊并嘗試加載策严。加載失敗會(huì)拋出importerror.

使用import item.subitem.subsubitem的時(shí)候,除了嘴后一個(gè)Item饿敲,其他的Item都必須是包妻导。最后一個(gè)item可以是一個(gè)模塊,一個(gè)包怀各,但不能是類或者函數(shù)倔韭、變量。

import * from a package

當(dāng)用戶書寫from sound.effects import *時(shí)會(huì)發(fā)生什么渠啤?理想情況下狐肢,這種方式能進(jìn)入文件系統(tǒng),找到程序包中存在哪些子模塊沥曹,然后將其全部導(dǎo)入份名。這可能會(huì)花費(fèi)很長時(shí)間,并且導(dǎo)入子模塊可能會(huì)產(chǎn)生有害的副作用妓美,這些副作用只有在明確導(dǎo)入子模塊時(shí)才會(huì)發(fā)生僵腺。

唯一的解決方案是讓程序包作者提供程序包的顯式索引。該import語句使用以下約定:如果程序包的 __init__.py代碼定義了名為的列表__all__壶栋,則將其視為遇到時(shí)應(yīng)導(dǎo)入的模塊名稱的列表辰如。發(fā)行新版本的軟件包時(shí),軟件包作者有責(zé)任使此列表保持最新贵试。如果軟件包作者看不到從軟件包中導(dǎo)入*的用途琉兜,他們可能還會(huì)決定不支持它。例如毙玻,該文件可能包含以下代碼:

__all__ = ["echo", "surround", "reverse"]

這意味著from sound.effects import *將導(dǎo)入sound包的三個(gè)命名子模塊豌蟋。

如果__all__沒有定義,語句 也不會(huì)導(dǎo)入從包中的所有子模塊到當(dāng)前的命名空間; 它僅確保已導(dǎo)入包sound.effects(可能運(yùn)行__init__.py中任何初始化代碼)桑滩,然后導(dǎo)入包中定義的任何名稱梧疲。這包括由__init__.py定義的任何名稱(以及明確加載的子模塊)。它還包括程序包的所有子模塊运准,這些子模塊由先前的語句顯式加載幌氮。考慮以下代碼:
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
在此示例中胁澳,echosurround模塊被導(dǎo)入當(dāng)前名稱空間中该互,因?yàn)樗鼈冊趫?zhí)行語句sound.effects時(shí)在包中定義from...import。(這在__all__定義時(shí)也適用 韭畸。)

盡管某些模塊被設(shè)計(jì)為僅在使用時(shí)導(dǎo)出遵循某些模式的名稱慢洋,但在生產(chǎn)代碼中import *仍被認(rèn)為是不好的做法塘雳。

記住,使用from package import specific_submodule沒什么錯(cuò)普筹。實(shí)際上败明,這是推薦的表示法,除非導(dǎo)入模塊需要使用來自不同軟件包的具有相同名稱的子模塊太防。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妻顶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蜒车,更是在濱河造成了極大的恐慌讳嘱,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酿愧,死亡現(xiàn)場離奇詭異沥潭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嬉挡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門钝鸽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人庞钢,你說我怎么就攤上這事拔恰。” “怎么了基括?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵颜懊,是天一觀的道長。 經(jīng)常有香客問我风皿,道長河爹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任桐款,我火速辦了婚禮昌抠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鲁僚。我一直安慰自己,他們只是感情好裁厅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布冰沙。 她就那樣靜靜地躺著,像睡著了一般执虹。 火紅的嫁衣襯著肌膚如雪拓挥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天袋励,我揣著相機(jī)與錄音侥啤,去河邊找鬼当叭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盖灸,可吹牛的內(nèi)容都是我干的蚁鳖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赁炎,長吁一口氣:“原來是場噩夢啊……” “哼醉箕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徙垫,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤讥裤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后姻报,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體己英,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年吴旋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了损肛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邮府,死狀恐怖荧关,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褂傀,我是刑警寧澤忍啤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站仙辟,受9級(jí)特大地震影響同波,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叠国,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一未檩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粟焊,春花似錦冤狡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至香追,卻和暖如春合瓢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背透典。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工晴楔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顿苇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓税弃,卻偏偏與公主長得像纪岁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子钙皮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • If you quit from the Python interpreter and enter it agai...
    linyk3閱讀 359評(píng)論 0 0
  • 如果你從 Python 解釋器退出然后再進(jìn)入它蜂科,你所做的定義(函數(shù)和變量)都會(huì)消失。因此短条,如果你想寫某些更長的程序...
    派派森森閱讀 582評(píng)論 0 1
  • 用 python 解釋器來編程從 Python 解釋器退出再進(jìn)入导匣,那么你定義的所有的方法和變量就都消失了。 為此...
    chen_000閱讀 523評(píng)論 0 3
  • [譯]The Python Tutorial#Modules 6. Modules 如果你從Python解釋器中退...
    理查德成閱讀 325評(píng)論 0 2
  • 在前面的幾個(gè)章節(jié)中我們腳本上是用 python 解釋器來編程茸时,如果你從 Python 解釋器退出再進(jìn)入贡定,那么你定義...
    Java丶python攻城獅閱讀 294評(píng)論 0 0