2017-08-23 1 views
1

J'essaye actuellement d'extraire des informations de résultat de modèle de H2O en Python.Python: passe la fonction en tant qu'argument, évalue avec try/except et renvoie le résultat

Pour le contexte, j'ai quelque chose le long des lignes suivantes:

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

Une fois le modèle est formé, je peux appeler les différents paramètres du modèle. Cependant, certaines mesures ne seront générées qu'en fonction du type de modèle. Par exemple, je pourrais appeler le model.mse(valid=True) et il retournera une valeur. Par exemple, je peux appeler le model.mse(valid=True). mais si j'appelle model.aic(valid=True) il lancera et exception si AIC n'a pas été généré. C'est un problème car j'ai besoin de générer une fonction qui écrit toutes les métriques générées dans une table HIVE. Si la métrique n'a pas été générée et que l'appel lance une exception, nous écrirons simplement NULL à hive.

Alors, je l'ai essayé de faire ce qui suit:

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

Cela correctement pour revenir None la valeur AIC

Cependant, je dois le faire pour chaque paramètre, donc préférerais envelopper une fonction générique autour d'elle. Par exemple, je voudrais passer la fonction model.aic() en tant que paramètre à une fonction appelée tryParam, qui l'évalue ensuite et attrape toutes les expections qui se produisent. Tels que:

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

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

Cependant, cela ne fonctionne pas. Lorsque j'appelle tryParam(model.aic()) l'exception est déclenchée et le programme s'arrête. Il me semble que le paramètre est en cours d'évaluation avant d'être passé à tryParam (d'où le déclenchement de l'exception avant que le code pour le gérer ne soit appelé). Ce n'est qu'une supposition cependant.

Est-ce que quelqu'un sait comment je pourrais faire cela?

+2

Comme une note de côté, vous voudrez peut-être seul hic exception attendue - une clause catch-all except peut cacher d'autres problèmes, spécialement quand elle ne fait que silencer et ignore l'exception. –

Répondre

3

Appelez la fonction à l'intérieur tryParam avec tous les args ou kwargs passés. Ensuite, passez la fonction elle-même plutôt que de l'appeler, avec tous les args ou kwargs.

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

En partie le résout mais m'a amené sur la bonne voie! (J'ai laissé de côté une partie de l'exigence, qui est que model.aic doit être appelé avec des arguments de mot-clé aussi bien). Au lieu de simplement passer getParam, je dois également passer ** kwargs. Retournez ensuite getParam (** kwargs). Enfin, appelez tryParam (model.aic, "valid = True"). – Karl

0

Je voudrais essayer de le faire de cette façon:

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

je peux utiliser comme:

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

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

Repl.it example here