2017-03-01 58 views
2

前一段時間,我需要R中的一個retry函數來處理緩慢的服務器響應。該功能將有以下行爲:(嘗試一個動作(函數或方法),如果失敗,稍等一會,然後重試)X10Python中的重試函數

我想出了以下內容:

retry <- function(fun, max_trys = 10, init = 0){ 
    suppressWarnings(tryCatch({ 
    Sys.sleep(0.3); 
    if(init<max_trys) {fun} 
}, error=function(e){retry(fun, max_trys, init = init+1)}))} 

它運作良好。現在我需要在Python3一樣的,所以我試圖做同樣的代碼:

import time 
def retry_fun(fun, max_trys = 10, init=0): 
    try: 
     time.sleep(0.3) 
     if(init<max_trys): 
      fun 
    except: 
     retry_fun(fun, max_trys, init = init+1) 

但是當我運行它,它崩潰我的內核。由於我在Python中是一個初學者,我不確定是什麼導致了崩潰,以及如果/如何將一個函數作爲參數傳遞給另一個函數。

你能幫我嗎?

+1

你可以像這樣傳遞函數作爲參數,但是你應該像'fun()'那樣調用它。 – Archimaredes

回答

2

除了能夠傳遞函數並在名稱後面添加()(Python的語法用於調用調用)之外,您的不需要需要使用遞歸;只要把它在一個循環:

import time 
def retry(fun, max_tries=10): 
    for i in range(max_tries): 
     try: 
      time.sleep(0.3) 
      fun() 
      break 
     except Exception: 
      continue 

except Exception應改爲趕上meaningfull例外,該功能可能會提高。使用Exception(正如我在示例中所做的那樣)通常是不好的做法,因爲它捕獲了一大類您可能不想被捕獲的異常。

除此之外,使用for-loop而不是明確的第三計數器和遞歸(這導致對於大值的長調用堆棧)更好。

+0

在你的代碼中,'fun()'似乎運行'max_tries'時間,無論fun()是否正確完成。如果'fun()'正確完成測試可能更好。 – EvanL00

+0

@EvanL00確實,你可以在函數調用後添加一個'break'。 –