Python如何实现可接收任意参数函数作为入参的通用重试函数
问题原因
你当前的代码存在两个核心错误:
- 调用
retry_function时直接传入some_other_function(..,..,..),这一步会直接执行目标函数,你传入重试函数的实际是函数的执行结果而非函数本身,重试逻辑完全无法生效 - 重试函数内部的
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
相关产品推荐
相关产品推荐

