python 裝飾器真是很好的設(shè)計(jì)模式摄悯。不會污染你的功能代碼赞季。
工作中裝飾器用到的地方主要有:記錄log,計(jì)算函數(shù)運(yùn)行所需的時(shí)間以及函數(shù)失敗后的重試奢驯。
下面是失敗后重試的裝飾器代碼申钩,僅供參考。
其中@functools.wraps(func)這句代碼會把被裝飾的函數(shù)的name屬性復(fù)制到wrapper()函數(shù)中叨橱。
當(dāng)然等價(jià)的代碼:wrapper.name = func.name 也是可以的典蜕。但是還是優(yōu)先使用functools。
import time
import functools
# 裝飾器1罗洗,每次重試操作之間的延時(shí)時(shí)間隨著循環(huán)逐漸延長
def deco(num=5):
''' 裝飾器: 參數(shù)num是重試的次數(shù)愉舔,默認(rèn)是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):
''' 功能函數(shù),需要返回執(zhí)行成功或失敗的標(biāo)志 '''
print arg
return True
這個(gè)裝飾器伙菜,可以自定義每次重試操作之間的延時(shí)時(shí)間轩缤,每次操作之間的時(shí)間都一樣
def retry_deco(num=5, sleep_time=1):
"""
:param num:重試的次數(shù),數(shù)值型,默認(rèn)5次贩绕,使用時(shí)可修改
:param sleep_time: 每次重試之間延時(shí)的時(shí)間,數(shù)值型, 單位為s火的,默認(rèn)1s掠归,使用時(shí)可修改
:return:可調(diào)用的函數(shù)對象
: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)