如果您只是想使用库本身,那么您实际上无法像这样使用装饰器。它的参数是在调用时固定的(除了对可变参数进行操作)。相反,您可以在每次调用函数之前始终调用装饰器。这使您可以根据需要更改重试参数。
例如:
def post(url, json):
...
rety(post, wait_exponential_multiplier=...)(url=..., json=...)
但此时,您可以完全跳过装饰器,并使用装饰器正在使用的内容。
from retrying import Retrying
def post(url, json):
...
Retrying(wait_exponential_multiplier=...).call(post, url=..., json=...)
这两种方式都可以让您保持post
函数的纯洁性,并将其与重试的概念分离开来(使在不需要重试行为时更容易调用post
)。
您还可以编写一个便捷函数作为包装器,为程序填充默认值。例如:
def retrier(wait_exponential_multiplier=2, **kwargs):
return Retrying(wait_exponential_multiplier=wait_exponential_multiplier, **kwargs)
retrier(wait_exponential_max=10).call(post, url=..., json=...)
retrier(wait_exponential_multiplier=3, wait_exponential_max=10).call(post, url=..., json=...)
post
函数具有签名post(url, json, wait_exponential_multiplier, exponential_max)
吗? - Edward Minnix