使用函数作为参数在Python中编写重试机制

时间:2018-12-22 03:34:01

标签: python python-2.7 functional-programming

我想用Python编写重试机制以实现不稳定的网络通信。

我的服务有多种类型的方法:

method1()
method2(arg1)
method3(arg1, arg2)

我想将方法​​传递给一个函数,该函数将重试传递给它的任何方法(我认为它可能看起来像这样):

retry (service.method1)
retry (service.method2, arg1)
retry (service.method3, arg1, arg2)

如何编写此重试方法?不幸的是我正在使用Python 2.7.15

1 个答案:

答案 0 :(得分:1)

def retry(fn, *args, **kwargs):
    return fn(*args, **kwargs)

这样,retry的第一个参数是函数(方法),它将采用任意数量的参数和关键字参数,并将它们传递给fn。这通常被称为“拆包”,尽管在其他语言中我听说它被称为“ splat”。

此版本只是立即调用它,但是您可以根据需要添加延迟,循环或其他内容。


  

我想进一步了解您在这里使用的语法。我在看什么?

>>> def print_them(*args, **kwargs):
...     print(args, kwargs)  # args is a tuple & kwargs is a dict
...   
>>> print_them(1, 2, 3, spam='foo', bacon='bar')
(1, 2, 3) {'spam': 'foo', 'bacon': 'bar'}
>>> print(1, 2, 3, sep=':')       
1:2:3
>>> print(*[1, 2, 3], **{'sep': ':'})  # equivalent to the above
1:2:3

这是函数定义和函数调用的语法的一部分,就像,()一样。它与指数和乘法运算符的含义完全不同。