python装饰器--原来如此简单-python重试装饰器的简单实现方法

简单实现了一个在函数执行出现异常时自动重试的装饰器,支持控制最多重试次数,每次重试间隔,每次重试间隔时间递增。

最新的代码可以访问从github上获取

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2017/8/18 上午9:50

# @Author : Matrix

# @Github : https://github.com/blackmatrix7/

# @Blog : http://www.cnblogs.com/blackmatrix/

# @File : retry.py

# @Software: PyCharm

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重试装饰器的简单实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值