python裝飾器

python 裝飾器真是很好的設(shè)計(jì)模式。不會(huì)污染你的功能代碼。

工作中裝飾器用到的地方主要有:記錄log,計(jì)算函數(shù)運(yùn)行所需的時(shí)間以及函數(shù)失敗后的重試。

下面是失敗后重試的裝飾器代碼,僅供參考。

其中@functools.wraps(func)這句代碼會(huì)把被裝飾的函數(shù)的name屬性復(fù)制到wrapper()函數(shù)中。

當(dāng)然等價(jià)的代碼:wrapper.name = func.name 也是可以的。但是還是優(yōu)先使用functools。

import time
import functools

# 裝飾器1,每次重試操作之間的延時(shí)時(shí)間隨著循環(huán)逐漸延長(zhǎng)

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ù)對(duì)象
    :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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容