Python Tenacity库:retry装饰器中after与retry_error_callback作用解析
Tenacity中
after和retry_error_callback参数详解 一、after参数
- 核心作用:每次调用失败后都会触发,不管后续还有没有重试次数。简单说就是每失败一次,就执行一次这个回调逻辑,之后再进入等待(如果还能重试的话)。
- 你的代码问题:直接写
after=logger.error("Error")会在装饰器加载时就立即执行一次日志,而不是在失败后触发。正确的做法是传一个可调用对象,比如用lambda接收重试状态参数:
或者定义单独的函数:after=lambda state: logger.error(f"调用失败,当前是第{state.attempt_number}次重试")def log_retry_failure(state): logger.error(f"调用失败,已重试{state.attempt_number}次") @retry(after=log_retry_failure, ...)
二、retry_error_callback参数
- 核心作用:当所有重试次数耗尽、彻底失败时才触发,是重试流程的最后一步。这个回调可以返回一个值,替代原本会抛出的
RetryError,让调用方拿到返回值而非异常。 - 你的代码问题:同样不能直接传
logger.error("Error"),正确写法示例:
或者如果想返回默认值:retry_error_callback=lambda state: logger.error(f"所有{state.stop.max_attempt_number}次重试都失败了") or Nonedef handle_final_failure(state): logger.error("重试全部失败") return "默认返回值" @retry(retry_error_callback=handle_final_failure, ...)
修正后的完整代码示例
from tenacity import retry, stop_after_attempt, wait_exponential, wait_random @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=3, max=3) + wait_random(0, retry_wait_jitter), after=lambda state: logger.error(f"调用失败,已重试{state.attempt_number}次"), retry_error_callback=lambda state: logger.error(f"3次重试全部失败") or None ) def your_function(): # 你的业务逻辑 pass
内容的提问来源于stack exchange,提问作者joepitz1
相关产品推荐
相关产品推荐

