Python中如何優(yōu)雅的使用assert斷言

什么是assert斷言

Assert statements are a convenient way to insert debugging assertions into a program

斷言聲明是用于程序調(diào)試的一個便捷方式腕侄。斷言可以看做是一個debug工具淮阐,Python的實現(xiàn)也符合這個設計哲學甩卓,在Python中assert語句的執(zhí)行是依賴于__debug__這個內(nèi)置變量的祭衩,其默認值為True韭赘。當__debug__True時赂韵,assert語句才會被執(zhí)行蝴悉。

對于一般的聲明辫红,assert expression等價于

if __debug__:
    if not expression: raise AssertionError

assert可以同時聲明兩個個expression晴裹,例如assert expression1, expression2等價于

if __debug__:
    if not expression1: raise AssertionError(expression2)

如果執(zhí)行腳本文件時加上-O參數(shù)被济, __debug__則為False

舉一個例子,假設我們有一個腳本testAssert.py涧团,內(nèi)容為:

print(__debug__)
assert 1 > 2

當使用python assert.py運行時只磷,__debug__會輸出True,assert 1 > 2語句會拋出AssertionError異常泌绣。

當使用python -O assert.py運行時钮追,__debug__會輸出False,assert 1 > 2語句由于沒有執(zhí)行不會報任何異常阿迈。

斷言和異常的使用場景

先說結(jié)論:

檢查先驗條件使用斷言元媚,檢查后驗條件使用異常

舉個例子來說明一下,在開發(fā)中我們經(jīng)常會遇到讀取本地文件的場景苗沧。我們定義一個read_file方法刊棕。

def read_file(path):
    assert isinstance(file_path, str)
    ...

read_file函數(shù)要求在開始執(zhí)行的時候滿足一定條件:file_path必須是str類型,這個條件就是先驗條件待逞,如果不滿足鞠绰,就不能調(diào)用這個函數(shù),如果真的出現(xiàn)了不滿足條件的情況飒焦,證明代碼中出現(xiàn)了bug蜈膨,這時候我們就可以使用assert語句來對file_path的類型進行推斷屿笼,提醒程序員修改代碼,也可以使用if...raise...語句來實現(xiàn)assert翁巍,但是要繁瑣很多驴一。在很多優(yōu)秀的Python項目中都會看到使用assert進行先驗判斷的情況,平時可以多多留意灶壶。

read_file函數(shù)在被調(diào)用執(zhí)行后肝断,依然需要滿足一定條件,比如file_path所指定的文件需要是存在的驰凛,并且當前用戶有權(quán)限讀取該文件胸懈,這些條件稱為后驗條件,對于后驗條件的檢查恰响,我們需要使用異常來處理趣钱。

def read_file(file_path):
    assert isinstance(file_path, str)
    if not check_exist(file_path):
        raise FileNotFoundError()
    if not has_privilege(file_path):
        raise PermissionError()

文件不存在和沒有權(quán)限,這兩種情況并不屬于代碼bug胚宦,是代碼邏輯的一部分首有,上層代碼捕獲異常后可能會執(zhí)行其他邏輯,因此我們不能接受這部分代碼在生產(chǎn)環(huán)境中被忽略枢劝。并且井联,相比于assert語句只能拋出AssertionError,使用異衬裕可以拋出更詳細的錯誤烙常,方便上層代碼針對不同錯誤執(zhí)行不同的邏輯。


參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鹤盒,一起剝皮案震驚了整個濱河市军掂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昨悼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跃洛,死亡現(xiàn)場離奇詭異率触,居然都是意外死亡,警方通過查閱死者的電腦和手機汇竭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門葱蝗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人细燎,你說我怎么就攤上這事两曼。” “怎么了玻驻?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵悼凑,是天一觀的道長偿枕。 經(jīng)常有香客問我,道長户辫,這世上最難降的妖魔是什么渐夸? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮渔欢,結(jié)果婚禮上墓塌,老公的妹妹穿的比我還像新娘。我一直安慰自己奥额,他們只是感情好苫幢,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垫挨,像睡著了一般韩肝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棒拂,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天伞梯,我揣著相機與錄音,去河邊找鬼帚屉。 笑死谜诫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的攻旦。 我是一名探鬼主播喻旷,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牢屋!你這毒婦竟也來了且预?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤烙无,失蹤者是張志新(化名)和其女友劉穎锋谐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體截酷,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡涮拗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迂苛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片三热。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖三幻,靈堂內(nèi)的尸體忽然破棺而出就漾,到底是詐尸還是另有隱情,我是刑警寧澤念搬,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布抑堡,位于F島的核電站摆出,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏夷野。R本人自食惡果不足惜懊蒸,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望悯搔。 院中可真熱鬧骑丸,春花似錦、人聲如沸妒貌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灌曙。三九已至菊碟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間在刺,已是汗流浹背逆害。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚣驼,地道東北人魄幕。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像颖杏,于是被迫代替她去往敵國和親纯陨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355