You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 None
    
    或者如果想返回默认值:
    def 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:02:32