Python:擴充函數(shù)參數(shù)

在使用裝飾器的過程中,我們有時候會遇到這樣的一個問題:
我有一個裝飾器 & 我有一個函數(shù)。裝飾器的某一個參數(shù)需要在我使用函數(shù)的時候動態(tài)輸入,又或者我不能改變這個函數(shù)的情況下需要增加參數(shù)表來額外增加一些功能。
例如在Django定時任務(wù)這篇文章的最后我提到repeat關(guān)鍵字參數(shù)來控制函數(shù)的運行周期,這種時候我們該如何實現(xiàn)呢?

Solution


以上面文章提到的@background()裝飾器為例(邏輯部分略過,只解析參數(shù))。
可以這樣實現(xiàn)

from functools import wraps

def background(*, schedule):
    def dont_care_name(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            try:
                repeat = kwargs.pop("repeat")
                # do something with repeat
            except KeyError:
                pass
            return func(*args, **kwargs)
        return wrapper
    # do something with schedule
    return dont_care_name

其他都是細枝末節(jié),重要的是,我們在獲取函數(shù)參數(shù)的那一層函數(shù)里嘗試截取repeat這個關(guān)鍵字參數(shù)。使得無論這個參數(shù)存在與否都不會影響到func()的執(zhí)行。

  • 這一功能好處在于,如果我有一個通用裝飾器。那么只需要一點小小的修改,就既兼容了以前的代碼,又增加了新的功能。并且函數(shù)使用起來就像從未發(fā)生改變過一樣。壞處是:如果你的代碼對速度要求苛刻到一點點的扣時間優(yōu)化,那么這種寫法會讓你的運行速度多上幾毫秒。(但既然要求速度,何不用Go呢,笑)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 來福建一年多一點了,當(dāng)剛剛深圳待了兩個月,突然接到要調(diào)到福建的消息還是很意外的,沒有做過業(yè)務(wù)的自己能不能幫著上級...
    破舊的風(fēng)閱讀 309評論 0 1
  • ———————————————————— 憑直覺選一個 _ _ _ _ _ 測試結(jié)果 第一只眼睛 你的性格有矛盾之...
    九號館閱讀 437評論 0 0
  • 媳婦能生,這絕對不是貶低她,是打心眼里高興。 她在5年時間里生了3個孩子,都是兒子,多產(chǎn),高效。 按說她也算是經(jīng)驗...
    予墨讀書閱讀 1,016評論 0 0

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