经常会遇到一些需要重试的函数,在这种情况下,使用装饰器是比较合理的解决方案
def auto_retry(times=3, low=1, high=2):
"""
automatically retry function wrapper
:param times: retry times, default 3 times
:type times: int
:param low: minimum random waiting time, default 1
:type low: int
:param high: maximum random waiting time, default 2
:type high: int
:return: wrapper
:rtype: Callable
"""
def outer_wrapper(f):
@wraps(f)
def wrapper(*args, **kwargs):
retry_index: int = 0
while retry_index < times:
result = f(*args, **kwargs)
if result:
return result
time.sleep(random.uniform(low, high))
retry_index += 1
return None
return wrapper
return outer_wrapper
@auto_retry()
def common_requests(method: str, **kwargs) -> Optional[Dict]:
.....