編寫高質(zhì)量Python代碼的59個(gè)有效方法 第6章 內(nèi)置模塊 第42條:用functools.wraps裝飾wrapper裝飾器

調(diào)試遞歸函數(shù)時(shí)我們常需要打印出每一步的參數(shù)及返回值犀呼,這時(shí)寫個(gè)裝飾器十分高效:

def trace(func):
    def wrapper(*args, **kw):
        result = func(*args, **kw)
        print(f"{func.__name__}({args}, {kw}) --> {result}")
        return result 
    return wrapper

@trace
def fibonacci(n):
    if n in (0, ):
        return 0
    return fibonacci(n-1) + fibonacci(n-2)

fibonacci(4)
>>>
fibonacci((1,), {}) --> 0
fibonacci((0,), {}) --> 0
fibonacci((2,), {}) --> 0
fibonacci((1,), {}) --> 0
fibonacci((3,), {}) --> 0

這種寫法的缺陷在于變量fibonacci變成了wrapper:

help(fibonacci)
>>>
Help on function wrapper in module __main__:
wrapper(**args, **kwargs)
print(fibonacci)
>>>
<function trace.<locals>.wrapper at 0x0000012B1C774598>

為了維護(hù)函數(shù)的接口国裳,修飾后的函數(shù),必須保留原函數(shù)的某些標(biāo)準(zhǔn)python屬性,例如吵聪,__name__劲装,__module__胧沫。因此我們需要wraps來裝飾wrapper:

from functools import wraps

def trace(func):
    @wraps
    def wrapper(*args, **kw):
        result = func(*args, **kw)
        print(f"{func.__name__}({args}, {kw}) --> {result}")
        return result 
    return wrapper

要點(diǎn)

  • 內(nèi)置的functools模塊提供了名為wraps的裝飾器,開發(fā)者定義自己的裝飾器時(shí)占业,應(yīng)用wraps對(duì)其做一些處理
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绒怨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纺酸,更是在濱河造成了極大的恐慌窖逗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件餐蔬,死亡現(xiàn)場(chǎng)離奇詭異碎紊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)樊诺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門仗考,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人词爬,你說我怎么就攤上這事秃嗜。” “怎么了顿膨?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵锅锨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我恋沃,道長(zhǎng)必搞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任囊咏,我火速辦了婚禮恕洲,結(jié)果婚禮上塔橡,老公的妹妹穿的比我還像新娘。我一直安慰自己霜第,他們只是感情好葛家,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泌类,像睡著了一般癞谒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上末誓,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天扯俱,我揣著相機(jī)與錄音,去河邊找鬼喇澡。 笑死迅栅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晴玖。 我是一名探鬼主播读存,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼呕屎!你這毒婦竟也來了让簿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤秀睛,失蹤者是張志新(化名)和其女友劉穎尔当,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹂安,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椭迎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了田盈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畜号。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖允瞧,靈堂內(nèi)的尸體忽然破棺而出简软,到底是詐尸還是另有隱情,我是刑警寧澤述暂,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布痹升,位于F島的核電站,受9級(jí)特大地震影響畦韭,放射性物質(zhì)發(fā)生泄漏视卢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一廊驼、第九天 我趴在偏房一處隱蔽的房頂上張望据过。 院中可真熱鬧,春花似錦妒挎、人聲如沸绳锅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳞芙。三九已至,卻和暖如春期虾,著一層夾襖步出監(jiān)牢的瞬間原朝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工镶苞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喳坠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓茂蚓,卻偏偏與公主長(zhǎng)得像壕鹉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聋涨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 包(lib)晾浴、模塊(module) 在Python中,存在包和模塊兩個(gè)常見概念牍白。 模塊:編寫Python代碼的py...
    清清子衿木子水心閱讀 3,807評(píng)論 0 27
  • 雖然人們能利用函數(shù)閉包(function clouser)寫出簡(jiǎn)單的裝飾器脊凰,但其可用范圍常受限制。多數(shù)實(shí)現(xiàn)裝飾器的...
    gomibako閱讀 1,024評(píng)論 0 4
  • node js中使用supervisor實(shí)時(shí)監(jiān)測(cè)文件修改并自動(dòng)重啟應(yīng)用的功能茂腥,從而避免大量重復(fù)的CTRL+C終止程...
    demo11閱讀 679評(píng)論 0 0
  • 今天2017年狸涌,6月4日。晴础芍。 距離2017年1月2日杈抢,訂閱李笑來《通往財(cái)富自由之路》5個(gè)月零2天。 就在今天仑性,專...
    A張爽閱讀 164評(píng)論 0 0
  • 第二天起惶楼,風(fēng)泣就開始了艱苦的苦修日子。 因?yàn)椴荒軐煾赴咨竦拇嬖诟嬖V自己的父親诊杆,風(fēng)泣清晨歼捐、傍晚都要繼續(xù)進(jìn)行仙嵐宗的...
    聽風(fēng)花雨閱讀 243評(píng)論 0 0