[Python3] 带失败重试及日志功能的装饰器

本文介绍了如何在Python3中实现一个装饰器,该装饰器具备失败重试和日志记录功能,尤其适用于HTTP请求。在需求背景下,装饰器需在每次请求时记录日志,失败请求按指定次数重试。文章详细阐述了装饰器的实现过程,包括简单装饰器、带参数的装饰器以及装饰器顺序,并提供了相关的代码示例。
摘要由CSDN通过智能技术生成
写在前面

有疑问可在评论处留言,欢迎大家一起交流探讨。考虑到网页我可能不经常看,若问题较为紧急,可关注微信公众号「燃烧吧数据」(id:data-fired),聊天框输入暗号:江湖救急,即可召唤小姐姐一枚~

一、需求背景

http请求的时候,能够实现每次请求不管是失败还是成功,都能输出一条日志。并且失败的请求能够按照指定的重试次数,进行重试(因为每次重试都是一次请求,所以重试的时候也要输出日志)。

二、python代码实现带失败重试及日志功能的装饰器

如果你对装饰器的概念还懵懵懂懂,可以先看第三部分关于装饰器的介绍,然后再回过头来看这一部分。
剖析一下需求:首先,日志应该是每一次执行都要输出的。其次,因为要进行失败重试,那么重试的每一次都应该有日志输出。所以逻辑上应该,日志功能的装饰器在里层,失败重试的装饰器在外层。再次,因为失败重试一般需要指定重试次数,所以失败重试的装饰器应该是个带参数的装饰器,参数就是失败重试的次数。

  • python版本:python3.6.6
  • 代码实现:
from functools import wraps


def generate_log(func):
    """
    输出日志的装饰器
    :param func:
    :return:
    """
    @wraps(func)
    def wrapper(a):
        result = func(a)  # 把 foo 当做参数传递进来时,执行func()就相当于执行foo()
        print(f"这是一条日志:{func.__name__} is running")
        return result

    return wrapper
# generate_log() 相当于 wrapper
# wrapper() 相当于fun()
  
  
def fail_retry(try_times):
    """
    失败重试的装饰器
    :param try_times:
    :return:
    """
    def decorator(func):
        @wraps(func)
        def wrapper(a):
            current_result = func(a)
            if current_result:
                print('结果为True,即将进行失败重试')
                n = 1
                while n <= try_times:
                    a -= 1
                    print(f"{'*' * 5}第{n}次重试:参数值为:{a}{'*' * 5}")
                    retry_result = func(a)
                    if not retry_result:
                        break
                    n += 1
                return retry_result
            else:
                print('结果为False,无须失败重试')
                return current_result

        return wrapper

    return decorator
# fail_retry(try_times) 相当于 decorator
# decorator(func) 相当于 wrapper
# wrapper(a) 相当于fun(a)
# @fail_retry(try_times) 相当于 func = fail_retry(try_times)(func)
# 所以 func(a) 相当于 fail_retry(try_times)(func)(a)
  • 运行
@fail_retry(try_times=3)
@generate_log
def foo(a):
    if a > 3:
        return True
    else:
        return False
# @generate_log 相当于 foo = generate_log(foo)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值