温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用python怎么实现一个重试装饰器

发布时间:2021-04-20 17:28:34 来源:亿速云 阅读:327 作者:Leah 栏目:开发技术

今天就跟大家聊聊有关使用python怎么实现一个重试装饰器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

python是什么意思

Python是一种跨平台的、具有解释性、编译性、互动性和面向对象的脚本语言,其最初的设计是用于编写自动化脚本,随着版本的不断更新和新功能的添加,常用于用于开发独立的项目和大型项目。

import time from functools import wraps __author__ = 'blackmatrix' """ 在函数执行出现异常时自动重试的简单装饰器 """ class StopRetry(Exception):  def __repr__(self):   return 'retry stop' def retry(max_retries: int =5, delay: (int, float) =0, step: (int, float) =0,    exceptions: (BaseException, tuple, list) =BaseException,    sleep=time.sleep, callback=None, validate=None):  """  函数执行出现异常时自动重试的简单装饰器。  :param max_retries: 最多重试次数。  :param delay: 每次重试的延迟,单位秒。  :param step: 每次重试后延迟递增,单位秒。  :param exceptions: 触发重试的异常类型,单个异常直接传入异常类型,多个异常以tuple或list传入。  :param sleep: 实现延迟的方法,默认为time.sleep。  在一些异步框架,如tornado中,使用time.sleep会导致阻塞,可以传入自定义的方法来实现延迟。  自定义方法函数签名应与time.sleep相同,接收一个参数,为延迟执行的时间。  :param callback: 回调函数,函数签名应接收一个参数,每次出现异常时,会将异常对象传入。  可用于记录异常日志,中断重试等。  如回调函数正常执行,并返回True,则表示告知重试装饰器异常已经处理,重试装饰器终止重试,并且不会抛出任何异常。  如回调函数正常执行,没有返回值或返回除True以外的结果,则继续重试。  如回调函数抛出异常,则终止重试,并将回调函数的异常抛出。  :param validate: 验证函数,用于验证执行结果,并确认是否继续重试。  函数签名应接收一个参数,每次被装饰的函数完成且未抛出任何异常时,调用验证函数,将执行的结果传入。  如验证函数正常执行,且返回False,则继续重试,即使被装饰的函数完成且未抛出任何异常。  如回调函数正常执行,没有返回值或返回除False以外的结果,则终止重试,并将函数执行结果返回。  如验证函数抛出异常,且异常属于被重试装饰器捕获的类型,则继续重试。  如验证函数抛出异常,且异常不属于被重试装饰器捕获的类型,则将验证函数的异常抛出。  :return: 被装饰函数的执行结果。  """  def wrapper(func):   @wraps(func)   def _wrapper(*args, **kwargs):    nonlocal delay, step, max_retries    func_ex = StopRetry    while max_retries > 0:     try:      result = func(*args, **kwargs)      # 验证函数返回False时,表示告知装饰器验证不通过,继续重试      if callable(validate) and validate(result) is False:       continue      else:       return result     except exceptions as ex:      # 回调函数返回True时,表示告知装饰器异常已经处理,终止重试      if callable(callback) and callback(ex) is True:       return      func_ex = ex     finally:      max_retries -= 1      if delay > 0 or step > 0:       sleep(delay)       delay += step    else:     raise func_ex   return _wrapper  return wrapper if __name__ == '__main__':  pass

看完上述内容,你们对使用python怎么实现一个重试装饰器有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI