我希望有人发布一个比这个更好的解决方案,但我会使用这个方法,也许还有一个装饰师:def retry_if_fails(fn, exception=Exception, *args, **kwargs):
try:
fn(*args, **kwargs)
except exception:
fn(*args, **kwargs) # if this fails again here, the exception bubbles up
当然,问题是您只调用retry_if_fails中的一个函数,而不是像您所做的那样调用一个两步进的函数。在
您可以创建一个函数列表,并将该列表与用于参数的单独列表一起传递给要处理的每个函数。在
^{pr2}$
在本例中,args的列表和{}的dict列表必须按顺序匹配。all_args或all_kwargs中的空列表或空dict将使您不向特定函数传递任何参数,或仅传递args,或仅传递kwargs,或两者兼而有之。在fns = [some_func, another_func]
all_args = [['a', 'b'], # args for some_func
[] # no args for another_func
]
all_kwargs = [{'param': 'something'}, # kwargs for some_func
{} # no kwargs
]
与funcs、args和{}的列表不同,将它们放在一起可能更容易,就像zip-ing的结果一样,因为这就是您知道调用中的代码的方式:fns_with_args_and_kwargs = [(some_func, ['a', 'b'], {'param': 'something'}),
(another_func, [], {})
]
# and then
for fn, args, kwargs in fns_with_args_and_kwargs:
fn(*args, **kwargs)