2017-03-01 12 views
2

얼마 전에 느린 서버 응답을 처리하기 위해 R에서 retry 함수가 필요했습니다. 이 함수는 다음과 같은 동작 것이다 : 나는 함께했다파이썬에서 재시도 기능

10 배 (동작 (함수 또는 메소드)을 시도, 그리고 실패하면, 조금 기다린 후 다시 시도) 다음

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) 

을하지만 그것을 실행할 때, 내 커널 충돌입니다. 필자는 파이썬에서 초보자이기 때문에 충돌을 일으키는 원인이 무엇인지, 함수가 다른 함수에 인수로 전달 될 수 있는지 여부는 확실하지 않습니다.

나를 도와 줄 수 있습니까? 그렇다 기능을 전달하고 이름 (전화를 호출하는 파이썬의 구문) 후 ()을 추가하여 사용할 수있는에서

+1

함수를 인수로 전달할 수 있지만'fun()'와 같이 호출해야합니다. – Archimaredes

답변

2

, 당신은 재귀를 사용하지 필요성을 ; 단지 루프에 넣어 :

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()'는'fun()'가 정확하게 끝났는지 상관없이'max_tries' 시간을 실행하는 것처럼 보입니다. 어쩌면'fun()'가 올바르게 끝난 것이 더 나은지 테스트 할 수 있습니다. – EvanL00

+0

@ EvanL00 실제로 함수 호출 후에'break'를 추가 할 수 있습니다. –