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

Python如何实现可接收任意参数函数作为入参的通用重试函数

问题原因

你当前的代码存在两个核心错误:

  1. 调用retry_function时直接传入some_other_function(..,..,..),这一步会直接执行目标函数,你传入重试函数的实际是函数的执行结果而非函数本身,重试逻辑完全无法生效
  2. 重试函数内部的function只是引用了函数对象,没有加括号执行调用,哪怕传参正确也不会运行目标函数的逻辑

通用重试函数实现

要兼容任意参数的函数,使用Python的*args(可变位置参数)和**kwargs(可变关键字参数)即可实现,修改后的代码如下:

import time

def retry_function(function, retries, wait_time=0.4, *args, **kwargs):
    for i in range(retries):
        try:
            print(f"第 {i+1} 次尝试调用")
            # 执行目标函数,传入所有参数
            result = function(*args, **kwargs)
            print("调用成功")
            return result
        except Exception as e:
            print(f"调用失败,错误信息:{e},等待 {wait_time} 秒后重试")
            time.sleep(wait_time)
    # 所有重试耗尽仍失败,主动抛出异常(也可根据需求返回None)
    raise Exception(f"累计重试 {retries} 次后仍然调用失败")

调用方式

调用时第一个参数传函数本身(不要加括号),后续依次传入重试次数、等待时长,再跟目标函数需要的位置参数、关键字参数即可:

# 示例目标函数
def some_other_function(a, b, c):
    if a < 10:
        raise ValueError("参数过小")
    return a + b + c

# 调用重试函数
res = retry_function(some_other_function, 3, 0.5, 11, 2, c=3)
print(res) # 输出16

更易用的装饰器写法

如果不想每次调用都套一层重试函数,也可以用装饰器实现,使用起来更简洁:

import time

def retry(retries=3, wait_time=0.4):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(retries):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    print(f"第 {i+1} 次调用失败:{e},等待重试")
                    time.sleep(wait_time)
            raise Exception(f"重试 {retries} 次全部失败")
        return wrapper
    return decorator

# 给目标函数加上重试装饰器
@retry(retries=10, wait_time=0.4)
def some_other_function(a, b, c):
    if a < 10:
        raise ValueError("参数过小")
    return a + b + c

# 直接正常调用目标函数即可,自带重试逻辑
res = some_other_function(11, 2, 3)

注意事项

建议不要直接捕获所有Exception,最好指定需要重试的异常类型(比如网络异常、超时异常等),避免吞掉代码本身的语法错误、参数错误等不该重试的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:15:01