2017-08-23 2 views
1

Ich versuche derzeit, Modell-Ergebnisinformationen aus H2O in Python zu extrahieren.Python: Pass-Funktion als Argument, mit try/except auswerten und Ergebnis zurückgeben

Für Kontext, ich habe etwas in den folgenden Zeilen:

model = H2ODeepLearningEstimator(...) 
model.train() 

Nachdem das Modell trainiert wird, kann ich die verschiedenen Modellmetriken aufrufen. Einige Metrikwerte werden jedoch nur in Abhängigkeit vom Typ des Modells generiert.

So könnte ich zum Beispiel model.mse(valid=True) aufrufen und es wird einen Wert zurückgeben. aber wenn ich rufe model.aic(valid=True) wird es werfen und Ausnahme, wenn AIC nicht generiert wurde. Dies ist ein Problem, da ich eine Funktion generieren muss, die alle generierten Metriken in eine HIVE-Tabelle schreibt. Wenn die Metrik nicht generiert wurde und der Aufruf eine Ausnahme auslöst, schreiben wir einfach NULL in die Struktur.

Also, ich habe versucht, die folgendes zu tun:

param=None 
try: 
    param=tryParam(model.aic()) 
except: 
    pass 
print(param) 

Das wird richtig zurückkehren None für den AIC-Wert

Ich brauche aber diese für jeden Parameter zu tun, so würde es vorziehen, wickle eine generische Funktion um ihn herum. Ich möchte zum Beispiel die Funktion model.aic() als Parameter an eine Funktion mit dem Namen tryParam übergeben, die sie dann auswertet und alle auftretenden Expectationen abfängt. Wie zum Beispiel:

def tryParam(getParam): 
    try: 
     return getParam 
    except: 
     return None 

tryParam(model.aic()) 
tryParam(model.mse()) 
tryParam(model.mae()) 
etc. 

Dies funktioniert jedoch nicht. Wenn ich tryParam(model.aic()) rufe, wird die Ausnahme ausgelöst und das Programm stoppt. Es scheint mir, dass der Parameter ausgewertet wird, bevor er an tryParam übergeben wird (wodurch die Ausnahme ausgelöst wird, bevor der Code tatsächlich aufgerufen wird). Dies ist jedoch nur eine Vermutung.

Weiß jemand, wie ich das tun könnte?

+2

Als Randbemerkung, können Sie nur fangen wollen erwartete Ausnahme - eine catch-all-except-Klausel kann andere Probleme verbergen, insbesondere wenn sie die Ausnahme nur zum Schweigen bringt und ignoriert. –

Antwort

3

Rufen Sie die Funktion innerhalb tryParam mit allen Argumenten oder Kwargs übergeben.

Dann übergeben Sie die Funktion selbst, anstatt sie aufzurufen, zusammen mit allen Argumenten oder Kwargs.

tryParam(model.aic, valid=True) 
+0

Teilweise löst es, aber brachte mich auf den richtigen Weg! (Ich habe jedoch einen Teil der Anforderung weggelassen, das heißt, dass model.aic auch mit einigen Schlüsselwort-Segmenten aufgerufen werden muss). Anstatt getParam zu übergeben, muss ich auch ** kwargs weitergeben. Dann gib getParam (** kwargs) zurück. Schließlich tryParam aufrufen (model.aic, "valid = True"). – Karl

0

Ich würde versuchen, auf diese Weise zu tun:

def tryParam(obj, methodName): 
    method = getattr(obj, methodName, None) 
    if method is not None: 
     return method() 

Dann habe ich wie verwenden:

model = H2ODeepLearningEstimator(...) 
model.train() 

aic = tryParam(model, 'aic') 
mse = tryParam(model, 'mse') 
mae = tryParam(model, 'mae') 

Repl.it example here

Verwandte Themen