File size: 1,259 Bytes
529e208 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import time
from functools import wraps
from typing import Callable, Any
from loguru import logger
def retry(retries: int = 3, delay: float = 1) -> Callable:
"""
为函数提供重试逻辑的装饰器。
参数:
retries (int): 最大重试次数,默认为3。
delay (float): 两次重试之间的延迟时间(秒),默认为1。
返回:
Callable: 被装饰的函数。
异常:
ValueError: 如果retries小于1或delay小于等于0,则抛出此异常。
"""
if retries < 1 or delay <= 0:
raise ValueError('Wrong param')
def decorator(func: Callable) -> Callable:
@wraps(func)
def wrapper(*args, **kwargs) -> Any:
for i in range(1, retries + 1):
try:
return func(*args, **kwargs)
except Exception as e:
if i == retries:
logger.error(f'Error: {repr(e)}.')
logger.error(f'"{func.__name__}()" failed after {retries} retries.')
break
else:
logger.debug(f'Error: {repr(e)} -> Retrying...')
time.sleep(delay)
return wrapper
return decorator
|