我想用Python编写重试机制以实现不稳定的网络通信。
我的服务有多种类型的方法:
method1()
method2(arg1)
method3(arg1, arg2)
我想将方法传递给一个函数,该函数将重试传递给它的任何方法(我认为它可能看起来像这样):
retry (service.method1)
retry (service.method2, arg1)
retry (service.method3, arg1, arg2)
如何编写此重试方法?不幸的是我正在使用Python 2.7.15
答案 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
这是函数定义和函数调用的语法的一部分,就像,
或()
一样。它与指数和乘法运算符的含义完全不同。