python中@wraps的作用
下面兩種用法等效
1.
@functools.wraps
2.
from functools import wraps
@wraps
根據(jù)[1]:functools.wraps 旨在消除裝飾器對(duì)原函數(shù)造成的影響
#--------------------------------------
這東西,扯白了就是:
就是消除副作用。
#--------------------------------------
這里的副作用指的是:
原來(lái)是holiday函數(shù),被@wrapper?作用后,名字變成了inner,為了消除這個(gè)副作用,我們使用@wraps
#--------------------------------------
是不是非用不可?
不是
#--------------------------------------
既然不是非用不可,那為什么要使用@wraps?
設(shè)想下,你的函數(shù)設(shè)計(jì)出了錯(cuò),然后報(bào)錯(cuò)顯示是inner函數(shù),你會(huì)摸不著頭腦,這到底是對(duì)應(yīng)于哪個(gè)函數(shù)啊?
用了@wraps,你馬上知道是holiday函數(shù)這個(gè)環(huán)節(jié)除了問題,對(duì)于調(diào)試有幫助
?
附錄兩段代碼只有一句不同:
@wraps(func)的注釋與否
?
wraps就是個(gè)語(yǔ)法糖,語(yǔ)法糖的意思就是,不管你吃不吃糖,你都要把這中藥(語(yǔ)法)給我喝下!
中藥不是挺苦么,喝下/前,給你一顆糖。
#-----------------附錄---------------------
例子一:
使用@wraps
from functools import wrapsdef wrapper(func): # func = holiday@wraps(func)def inner(*args, **kwargs):print('在被裝飾的函數(shù)執(zhí)行之前做的事:比如公司檢查你休假前是否完成工作了,否則要求你無(wú)常加薪')ret = func(*args, **kwargs)print('在被裝飾的函數(shù)執(zhí)行之后做的事:比如檢查是否帶薪休假')return retreturn inner@wrapper # holiday = wrapper(holiday) def holiday(day):''' 這是一個(gè)放假通知 '''print('全體放假%s天'%day)return '好開心'print("--------------1------------------------------") print(holiday.__name__) print("--------------2------------------------------") print(holiday.__doc__)print("--------------下面調(diào)用該函數(shù)看下效果-----------------------------") holiday("111")不使用@wraps
from functools import wrapsdef wrapper(func): # func = holiday# @wraps(func)def inner(*args, **kwargs):print('在被裝飾的函數(shù)執(zhí)行之前做的事:比如公司檢查你休假前是否完成工作了,否則要求你無(wú)常加薪')ret = func(*args, **kwargs)print('在被裝飾的函數(shù)執(zhí)行之后做的事:比如檢查是否帶薪休假')return retreturn inner@wrapper # holiday = wrapper(holiday) def holiday(day):''' 這是一個(gè)放假通知 '''print('全體放假%s天'%day)return '好開心'print("--------------1------------------------------") print(holiday.__name__) print("--------------2------------------------------") print(holiday.__doc__)print("--------------下面調(diào)用該函數(shù)看下效果-----------------------------") holiday("111")?
例子二(這個(gè)例子的permission_required是裝飾test_func的):
from functools import wraps# 用戶角色權(quán)限確認(rèn) def permission_required():def decorator(f):@wraps(f)def decorated_function():return('this is decorated function')return decorated_functionreturn decorator# 管理員權(quán)限確認(rèn) def admin_required(f):return permission_required()(f)if __name__=='__main__':def test_func():return('this is test function')print(admin_required(test_func))?
from functools import wraps# 用戶角色權(quán)限確認(rèn) def permission_required():def decorator(f):#@wraps(f)def decorated_function():return('this is decorated function')return decorated_functionreturn decorator# 管理員權(quán)限確認(rèn) def admin_required(f):return permission_required()(f)if __name__=='__main__':def test_func():return('this is test function')print(admin_required(test_func))[1]Python functools.wraps 深入理解
[2]What does functools.wraps do?
?
總結(jié)
以上是生活随笔為你收集整理的python中@wraps的作用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: no such file or dire
- 下一篇: @staticmethod用法