Python:将函数作为参数传递,使用try / except进行求值并返回结果

时间:2017-08-23 10:43:07

标签: python h2o

我目前正在尝试从Python中提取H2O中的模型结果信息。

对于上下文,我有以下几点:

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

模型训练完成后,我可以调出各种模型指标。但是,某些指标只会根据模型的类型生成。

例如,我可以调用model.mse(valid=True)并返回一个值。但如果我调用model.aic(valid=True),如果没有生成AIC,它将抛出异常。这是一个问题,因为我需要生成一个函数,将所有生成的指标写入HIVE表。如果尚未生成度量并调用它会抛出一个except,我们只需将NULL写入hive。

所以,我试图做以下事情:

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

这将正确返回None的AIC值

但是,我需要为每个参数执行此操作,因此更喜欢围绕它包装泛型函数。例如,我想将函数model.aic()作为参数传递给名为tryParam的函数,该函数然后对其进行评估并捕获发生的任何预期。如:

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

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

然而,这不起作用。当我调用tryParam(model.aic())时,会引发异常并且程序停止。在我看来,参数在传递给tryParam之前正在进行评估(因此在实际调用处理它的代码之前触发异常)。这只是猜测。

有谁知道我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

调用tryParam内的函数,传递任何args或kwargs。

def tryParam(getParam, *args, **kwargs):
    try:
        return getParam(*args, **kwargs)
    except:   
        return None

然后传递函数本身而不是调用它,以及任何args或kwargs。

tryParam(model.aic, valid=True)

答案 1 :(得分:0)

我会尝试这样做:

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

然后我可以使用:

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

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

Repl.it example here