(資料科學學習手札54)Python中retry的簡單用法
一、簡介
retry是一個用於錯誤處理的模組,功能類似try-except,但更加快捷方便,本文就將簡單地介紹一下retry的基本用法。
二、基本用法
retry :
作為裝飾器進行使用,不傳入引數時功能如下例所示:
from retry import retry @retry() def demo(): print('錯誤') raise demo()
我們編寫了每次執行都會通過raise報錯的自定義函式demo(),利用預設引數的retry()進行裝飾,執行結果如下:
可以看到,retry()在這裡的功能,是在其裝飾的函式執行報錯後重新執行該函式,在上例中的效果就是反覆執行demo(),這也是retry()的基本用法,下面介紹其幾個主要引數:
exceptions:傳入指定的錯誤型別,預設為Exception,即捕獲所有型別的錯誤,也可傳入元組形式的多種指定錯誤型別
tries:定義捕獲錯誤之後重複執行次數,預設為-1,即為無數次
delay:定義每次重複執行之間的停頓時長,單位秒,預設為0,即無停頓
backoff:呈指數增長的每次重複執行之間的停頓時長,需要配合delay來使用,譬如delay設定為3,backoff設定為2,則第一次間隔為3*2**0= 1秒,第二次3*2**1=2秒,第三次3*2**2=4秒,以此類推,預設為1
max_delay:定義backoff和delay配合下出現的等待時間上限,當delay*backoff**n大於max_delay時,等待間隔固定為該值而不再增長
下面我們通過幾個直觀的例子來更加深刻地認識上述引數:
import time from retry import retry '''記錄初始時刻''' start_time = time.clock() @retry(delay=1,tries=4,backoff=2) def demo(start_time): '''將當前時刻與初始時刻的時間差(單位:S)作差並四捨五入''' print(round(time.clock()-start_time,0)) raise demo(start_time)
在上例中,我們設定delay為1,tries為4,backoff為2,通過我們的自定義函式來記錄每次重複執行與初始時刻的時間差,這樣第一次與第二次間隔時間為1*2**0=1,第二次與第三次間隔為1*2**1=2,第三次與第四次間隔4,執行結果如下,到達預定的執行狀況後程序就會報錯從而終止執行:
符合我們上面的計算結果,下面我們設定一個較小的max_delay:
import time from retry import retry '''記錄初始時刻''' start_time = time.clock() @retry(delay=1,tries=10,backoff=2,max_delay=20) def demo(start_time): '''將當前時刻與初始時刻的時間差(單位:S)作差並四捨五入''' print(round(time.clock()-start_time,0)) raise demo(start_time)
執行結果如下:
可以看到,在delay和backoff共同控制下的間隔時長超過20秒後,之後的每一次間隔時長都固定為20秒,直到所有的tries執行結束。
利用retry,我們可以在譬如網路爬蟲過程中更加簡潔靈活地控制錯誤處理過程,使得程式碼具有更好的可讀性,以上就是本文的基本內容,如有筆誤,望指出。