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

如何在Python Tenacity重试逻辑中使用外部作用域的Logger

解决方法

要在Tenacity的重试回调中使用外部传入的Logger,关键是利用Tenacity提供的retry_state对象——它包含了被重试函数的调用参数、重试状态等核心信息。

方案1:从retry_state中提取Logger参数

你之前的log_attempt_number定义了两个参数,但Tenacity的before回调只会自动传入retry_state一个参数,这是导致Logger无法传入的核心问题之一。我们可以修改回调函数,直接从retry_state里获取调用retry_function时传入的Logger:

from tenacity import retry, stop_after_attempt, wait_random

def log_attempt_number(retry_state):
    # 从被重试函数的位置参数中获取第一个参数(即logger)
    logger = retry_state.args[0]
    # 获取当前重试次数(首次调用计数为1,重试依次递增)
    attempt_num = retry_state.attempt_number
    logger.info(f"Attempt number {attempt_num}")
    logger.info("现在可以正常使用外部传入的Logger了")

@retry(stop=stop_after_attempt(3), wait=wait_random(min=1, max=3), before=log_attempt_number)
def retry_function(logger, driver):
    logger.info("Outer scope logger works fine here")
    source = driver.page_source
    return source

原理说明

  • retry_state.args:存储被重试函数调用时传入的位置参数列表,因为retry_function的第一个参数是logger,所以直接取args[0]即可。
  • 如果调用时用关键字参数传入logger(比如retry_function(logger=my_logger, driver=my_driver)),可以改用retry_state.kwargs.get('logger')来获取。
  • retry_state.attempt_number是Tenacity内置属性,用来表示当前是第几次重试(首次调用也会计数为1)。

方案2:使用闭包动态绑定Logger(适用于固定Logger场景)

如果你的retry_function只会被某个固定的Logger调用,可以用闭包提前绑定Logger,避免每次调用都传入:

from tenacity import retry, stop_after_attempt, wait_random
import logging

def create_log_callback(logger):
    def log_attempt_number(retry_state):
        attempt_num = retry_state.attempt_number
        logger.info(f"Attempt number {attempt_num}")
    return log_attempt_number

# 假设这里是外部传入的固定Logger
external_logger = logging.getLogger("external_logger")

# 用闭包生成绑定了Logger的回调函数
@retry(stop=stop_after_attempt(3), wait=wait_random(min=1, max=3), before=create_log_callback(external_logger))
def retry_function(driver):
    external_logger.info("Outer scope logger works fine here")
    source = driver.page_source
    return source

注意这个方案只适合Logger固定的场景,若需要每次调用retry_function都传入不同的Logger,方案1更灵活。


内容的提问来源于stack exchange,提问作者OJT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:20:20