2017-03-01 1 views
2

Vor einiger Zeit brauchte ich eine retry-Funktion in R, um langsame Serverantwort zu verarbeiten. Die Funktion würde das folgende Verhalten: (versuchen, eine Aktion (Funktion oder Methode), und wenn es scheitert, ein bisschen warten und dann erneut versuchen) x10Retry-Funktion in Python

ich kam mit dem folgenden:

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)}))} 

Es gut gearbeitet. Jetzt muss ich das gleiche in Python3, also versuchte ich den gleichen Code zu machen:

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) 

Aber wenn ich es laufen, es stürzt mein Kernel. Da ich in Python ein wenig Anfänger bin, bin ich mir nicht sicher, was den Absturz verursacht und ob/wie eine Funktion als Argument in eine andere Funktion übergeben werden kann.

Können Sie mir helfen?

+1

Sie können Funktionen als Argumente übergeben, aber Sie sollten es wie 'fun()' nennen. – Archimaredes

Antwort

2

Abgesehen von der Möglichkeit, Funktionen zu übergeben und sie verwenden, indem du () nach dem Namen (Python Syntax für Anrufe aufrufen), Sie nicht Notwendigkeit tun Rekursion zu verwenden; legt du es einfach in einer Schleife:

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 soll geändert werden, um eine sinnvolle Ausnahme zu fangen, dass die Funktion erhöhen könnte. Die Verwendung von Exception (wie ich in dem Beispiel getan habe) ist in der Regel eine schlechte Übung, da es eine große Klasse von Ausnahmen abfängt, die Sie möglicherweise nicht erwischt haben wollen.

Abgesehen davon ist die Verwendung eines for-loop anstelle eines expliziten dritten Zählers und Rekursion (was zu einem langen Aufruf-Stack für große Werte führt) besser.

+0

In deinem Code 'fun()' scheint 'max_tries' Zeit zu laufen, egal ob' 'fun()' korrekt beendet wurde. Vielleicht ist ein Test, wenn 'fun()' korrekt beendet wurde, besser. – EvanL00

+0

@ EvanL00 in der Tat, Sie könnten einfach eine Pause nach dem Funktionsaufruf hinzufügen. –