[英]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.