繁体   English   中英

如何以参数作为参数传递函数

[英]How to pass a function with argument(s) as argument

我有一堆写起来很简单的方法,但是它们都需要处理异常。 异常管理始终是相同的,因此我想将包装器作为函数编写,并以特定的函数调用实例作为参数来调用。 可能吗?

遵循这些原则(这是无效的插图):

def g(h):
    while True:
        try:
            x = h()
        except:
            # got an error
            print ("Unexpected error. Retry.")
        else:
            # everything is fine
            return x

def f1(x):
    # do something that may fail (e.g. access a distant server)
    y = (...whatever...) 
    return y

def f2(x,y):
    # do something else that may fail (e.g. access a distant server, but different request)
    z = (...whatever...) 
    return z

print (g(f1(3)))
print (g(f1(6)))
print (g(f2(5,'abc')))

注意:我在寻找不需要类定义的答案。 另外,我不熟悉python中的lambda函数,但是它可以作为解决方案的一部分吗?

您需要从第一个函数返回函数。

def g(h):
    def f(*arguments):
        try:
            x = h(*arguments)
        except:
            # got an error
            print ("Unexpected error. Retry.")
        else:
            # everything is fine
            return x
    return f

我正在使用*运算符来允许可变数量的参数: https : //docs.python.org/3/tutorial/controlflow.html#arbitrary-argument-lists

每次使用函数h调用g时,它将返回一个函数,当使用某些参数调用时,该函数将使用相同的参数调用h(但在错误处理内部)。

您现在可以将其用于:

g(f1)(3)

另外,您可以在g方法中直接使用*运算符,以避免创建新函数。

def g(h, *arguments):
    try:
        x = h(*arguments)
    except:
        # got an error
        print ("Unexpected error. Retry.")
    else:
        # everything is fine
        return x

然后,您将这样称呼它:

g(f1, 3, 4)

我找到了第一个替代清洁剂,尤其是因为您可以使用安全功能,因此可以进行以下操作:

safe_f1 = g(f1)
safe_f1(3)

这可能会有所帮助:

使用装饰器

def exception_handler_wrapper(fn):
    def new_fn(*args, **kwargs):
        try:
            result = fn(*args, **kwargs)
        except Exception as e:
            # return error string or print error string or log error string
            # or do whatever suits you, with the exception
            return "Error occured:" + str(e)
        else:
            return result
    return new_fn


@exception_handler_wrapper
def f1(x):
    # do something that may fail (e.g. access a distant server)
    # emulating something that may fail:
    if x % 2 == 0:
        return "success"
    else:
        raise ValueError("x not even")


@exception_handler_wrapper
def f2(x, y):
    # do something else that may fail (e.g. access a distant server, but
    # different request)
    # emulating something that may fail:
    if x != 0 or y != 'abc':
        return "success"
    else:
        raise Exception("Sum not 100")

print("Expression f1(3):", f1(3))
print("Expression f1(6):", f1(6))
print("Expression f2(5, 'abc'):", f2(5, 'abc'))

输出为:

Expression f1(3): Error happend:x not even
Expression f1(6): success
Expression f2(5, 'abc'): success

现在,你想处理其异常的任何功能,只需将@exception_handler_wrapper它之前def从头,你可以直接调用该函数通常与其说这是类似的: g(f1(6))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM