亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中優(yōu)雅使用assert斷言的方法實(shí)例

 更新時(shí)間:2021年09月18日 10:06:53   作者:王坤祥  
我們?cè)陂_發(fā)一個(gè)程序時(shí)候,與其讓它運(yùn)行時(shí)崩潰,不如在它出現(xiàn)錯(cuò)誤條件時(shí)就崩潰(返回錯(cuò)誤),這時(shí)候斷言assert就顯得非常有用,這篇文章主要給大家介紹了關(guān)于Python中優(yōu)雅使用assert斷言的相關(guān)資料,需要的朋友可以參考下

什么是 assert 斷言

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

斷言聲明是用于程序調(diào)試的一個(gè)便捷方式。斷言可以看做是一個(gè) debug 工具,Python 的實(shí)現(xiàn)也符合這個(gè)設(shè)計(jì)哲學(xué),在 Python 中 assert 語句的執(zhí)行是依賴于__debug__這個(gè)內(nèi)置變量的,其默認(rèn)值為True。當(dāng)__debug__為True時(shí),assert 語句才會(huì)被執(zhí)行。

對(duì)于一般的聲明,assert expression 等價(jià)于

if __debug__:
    if not expression: raise AssertionError

assert 可以同時(shí)聲明兩個(gè) expression,例如 assert expression1, expression2 等價(jià)于

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

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

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

print(__debug__)
assert 1 > 2

當(dāng)使用python assert.py運(yùn)行時(shí),__debug__會(huì)輸出 True,assert 1 > 2 語句會(huì)拋出 AssertionError 異常。

當(dāng)使用python -O assert.py運(yùn)行時(shí),__debug__會(huì)輸出 False,assert 1 > 2 語句由于沒有執(zhí)行不會(huì)報(bào)任何異常。

斷言和異常的使用場景

先說結(jié)論:

檢查先驗(yàn)條件使用斷言,檢查后驗(yàn)條件使用異常

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

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

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

read_file 函數(shù)在被調(diào)用執(zhí)行后,依然需要滿足一定條件,比如 file_path 所指定的文件需要是存在的,并且當(dāng)前用戶有權(quán)限讀取該文件,這些條件稱為后驗(yàn)條件,對(duì)于后驗(yà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,是代碼邏輯的一部分,上層代碼捕獲異常后可能會(huì)執(zhí)行其他邏輯,因此我們不能接受這部分代碼在生產(chǎn)環(huán)境中被忽略,這屬于后驗(yàn)條件。并且,相比于 assert 語句只能拋出 AssertionError,使用異常可以拋出更詳細(xì)的錯(cuò)誤,方便上層代碼針對(duì)不同錯(cuò)誤執(zhí)行不同的邏輯。

使用斷言的幾個(gè)原則

  1. 使用斷言捕捉不應(yīng)該發(fā)生的非法情況。不要混淆非法情況與錯(cuò)誤情況之間的區(qū)別,后者是必然存在的并且是一定要作出處理的。
  2. 使用斷言對(duì)函數(shù)的參數(shù)進(jìn)行確認(rèn)。 
  3. 在編寫函數(shù)時(shí),要進(jìn)行反復(fù)的考查,并且自問:“我打算做哪些假定?”一旦確定了的假定,就要使用斷言對(duì)假定進(jìn)行檢查。
  4. 一般教科書都鼓勵(lì)程序員們進(jìn)行防錯(cuò)性的程序設(shè)計(jì),但要記住這種編程風(fēng)格會(huì)隱瞞錯(cuò)誤。當(dāng)進(jìn)行防錯(cuò)性編程時(shí),如果“不可能發(fā)生”的事情的確發(fā)生了,則要使用斷言進(jìn)行報(bào)警。

斷言也可以用于代碼測試,用作一個(gè)做事毛手毛腳的開發(fā)人員的單元測試,只要能你接受當(dāng)使用-O標(biāo)志時(shí)這個(gè)測試什么都不做。我有時(shí)也會(huì)在代碼中用"assert Fasle"來對(duì)還沒有實(shí)現(xiàn)的分支作標(biāo)記,當(dāng)然我希望他們失敗。如果稍微更細(xì)節(jié)一些,或許觸發(fā)NotImplementedError是更好的選擇

另一個(gè)斷言用得好的地方就是檢查程序中的不變量。一個(gè)不變量是一些你能相信為真的條件,除非一個(gè)缺陷導(dǎo)致它變成假。如果有一個(gè)缺陷,越早發(fā)現(xiàn)越好,因此我們需要對(duì)其進(jìn)行測試,但我們不想因?yàn)檫@些測試而影響代碼執(zhí)行速度。因此采用斷言,它能在開發(fā)時(shí)生效而在產(chǎn)品中失效。

斷言也是一個(gè)很好的檢查點(diǎn)注釋。為了替代如下注釋:

#當(dāng)我們執(zhí)行到這里,我們知道n>2 
 
#你可以確保在運(yùn)行時(shí)用以下斷言:
 
assert n > 2

建議不使用斷言的情況:

  • 不要用于測試用戶提供的數(shù)據(jù),或者那些需要在所有情況下需要改變檢查的地方
  • 不要用于檢查你認(rèn)為在通常使用中可能失敗的地方。斷言用于非常特別的失敗條件。你的用戶絕不看到一個(gè)AssertionError,如果看到了,那就是個(gè)必須修復(fù)的缺陷。
  • 特別地不要因?yàn)閿嘌灾皇潜纫粋€(gè)明確的測試加一個(gè)觸發(fā)異常矮小而使用它。斷言不是懶惰的代碼編寫者的捷徑。
  • 不要將斷言用于公共函數(shù)庫輸入?yún)?shù)的檢查,因?yàn)槟悴荒芸刂普{(diào)用者,并且不能保證它不破壞函數(shù)的合約。
  • 不要將斷言用于你期望修改的任何錯(cuò)誤。換句話,你沒有任何理由在產(chǎn)品代碼捕獲一個(gè)AssertionError異常。
  • 不要太多使用斷言,它們使代碼變得晦澀難懂。

總結(jié)

到此這篇關(guān)于Python中優(yōu)雅使用assert斷言的文章就介紹到這了,更多相關(guān)Python優(yōu)雅使用assert斷言內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實(shí)現(xiàn)雙人五子棋(終端版)

    python實(shí)現(xiàn)雙人五子棋(終端版)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)終端版的雙人五子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 關(guān)于python time庫整理匯總

    關(guān)于python time庫整理匯總

    這篇文章主要給大家分享的是關(guān)于python time庫的整理,下面文章會(huì)介Time庫的作用,Time庫的使用及案列介紹,感興趣的小伙伴請(qǐng)和小拜年一起來閱讀下文吧
    2021-09-09
  • selenium+python環(huán)境配置教程詳解

    selenium+python環(huán)境配置教程詳解

    這篇文章主要介紹了selenium+python環(huán)境配置教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • Pycharm之如何安裝cv2 [python3.6]

    Pycharm之如何安裝cv2 [python3.6]

    這篇文章主要介紹了Pycharm之如何安裝cv2 [python3.6]問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • python提取圖像的名字*.jpg到txt文本的方法

    python提取圖像的名字*.jpg到txt文本的方法

    下面小編就為大家分享一篇python提取圖像的名字*.jpg到txt文本的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Opencv實(shí)現(xiàn)眼睛控制鼠標(biāo)的實(shí)踐

    Opencv實(shí)現(xiàn)眼睛控制鼠標(biāo)的實(shí)踐

    本文主要介紹了Opencv實(shí)現(xiàn)眼睛控制鼠標(biāo)的實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 一文詳解凱撒密碼的原理及Python實(shí)現(xiàn)

    一文詳解凱撒密碼的原理及Python實(shí)現(xiàn)

    凱撒密碼是古羅馬愷撒大帝用來對(duì)軍事情報(bào)進(jìn)行加密的算法,它采用了替換方法對(duì)信息中的每一個(gè)英文字符循環(huán)替換為字母表序列該字符后面第三個(gè)字符。本文主要為大家講解了凱撒密碼的原理及實(shí)現(xiàn),需要的可以參考一下
    2022-08-08
  • 使用apidocJs快速生成在線文檔的實(shí)例講解

    使用apidocJs快速生成在線文檔的實(shí)例講解

    下面小編就為大家分享一篇使用apidocJs快速生成在線文檔的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • python+Django+pycharm+mysql 搭建首個(gè)web項(xiàng)目詳解

    python+Django+pycharm+mysql 搭建首個(gè)web項(xiàng)目詳解

    這篇文章主要介紹了python+Django+pycharm+mysql 搭建首個(gè)web項(xiàng)目,結(jié)合實(shí)例形式詳細(xì)分析了python+Django+pycharm+mysql搭建web項(xiàng)目的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • numpy給array增加維度np.newaxis的實(shí)例

    numpy給array增加維度np.newaxis的實(shí)例

    今天小編就為大家分享一篇numpy給array增加維度np.newaxis的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11

最新評(píng)論