python 装饰器真是很好的设计模式。不会污染你的功能代码。
工作中装饰器用到的地方主要有:记录log,计算函数运行所需的时间以及函数失败后的重试。
下面是失败后重试的装饰器代码,仅供参考。
其中@functools.wraps(func)这句代码会把被装饰的函数的name属性复制到wrapper()函数中。
当然等价的代码:wrapper.name = func.name 也是可以的。但是还是优先使用functools。
import time
import functools
# 装饰器1,每次重试操作之间的延时时间随着循环逐渐延长
def deco(num=5):
''' 装饰器: 参数num是重试的次数,默认是5次'''
def _deco(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for i in xrange(num):
ret = func(*args, **kwargs)
if ret:
break
else:
time.sleep(i)
print "Retry %s" % i
return ret
return wrapper
return _deco
@deco(num=2)
def myfunc(arg):
''' 功能函数,需要返回执行成功或失败的标志 '''
print arg
return True
这个装饰器,可以自定义每次重试操作之间的延时时间,每次操作之间的时间都一样
def retry_deco(num=5, sleep_time=1):
"""
:param num:重试的次数,数值型,默认5次,使用时可修改
:param sleep_time: 每次重试之间延时的时间,数值型, 单位为s,默认1s,使用时可修改
:return:可调用的函数对象
:description:重试装饰器
"""
if sleep_time < 0:
sleep_time = 0
def _deco(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
ret = None
for i in xrange(num):
ret = func(*args, **kwargs)
if ret:
break
time.sleep(sleep_time)
print "Retry %s, sleep time: %s" % (i, sleep_time)
return ret
return wrapper
return _deco
@retry_deco(num=10, sleep_time=5)
def test(arg):
return True
if __name__ == "__main__":
print myfunc("xxxxxx")
test(10)