写在前面
有疑问可在评论处留言,欢迎大家一起交流探讨。考虑到网页我可能不经常看,若问题较为紧急,可关注微信公众号「燃烧吧数据」(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)

本文介绍了如何在Python3中实现一个装饰器,该装饰器具备失败重试和日志记录功能,尤其适用于HTTP请求。在需求背景下,装饰器需在每次请求时记录日志,失败请求按指定次数重试。文章详细阐述了装饰器的实现过程,包括简单装饰器、带参数的装饰器以及装饰器顺序,并提供了相关的代码示例。
最低0.47元/天 解锁文章
671

被折叠的 条评论
为什么被折叠?



