概述
下面两种用法等效
1.
@functools.wraps
2.
from functools import wraps
@wraps
根据[1]:functools.wraps 旨在消除装饰器对原函数造成的影响
#--------------------------------------
这东西,扯白了就是:
就是消除副作用。
#--------------------------------------
这里的副作用指的是:
原来是holiday函数,被@wrapper 作用后,名字变成了inner,为了消除这个副作用,我们使用@wraps
#--------------------------------------
是不是非用不可?
不是
#--------------------------------------
既然不是非用不可,那为什么要使用@wraps?
设想下,你的函数设计出了错,然后报错显示是inner函数,你会摸不着头脑,这到底是对应于哪个函数啊?
用了@wraps,你马上知道是holiday函数这个环节除了问题,对于调试有帮助
附录两段代码只有一句不同:
@wraps(func)的注释与否
wraps就是个语法糖,语法糖的意思就是,不管你吃不吃糖,你都要把这中药(语法)给我喝下!
中药不是挺苦么,喝下/前,给你一颗糖。
#-----------------附录---------------------
例子一:
使用@wraps
from functools import wraps
def wrapper(func): # func = holiday
@wraps(func)
def inner(*args, **kwargs):
print('在被装饰的函数执行之前做的事:比如公司检查你休假前是否完成工作了,否则要求你无常加薪')
ret = func(*args, **kwargs)
print('在被装饰的函数执行之后做的事:比如检查是否带薪休假')
return ret
return inner
@wrapper # holiday = wrapper(holiday)
def holiday(day):
''' 这是一个放假通知 '''
print('全体放假%s天'%day)
return '好开心'
print("--------------1------------------------------")
print(holiday.__name__)
print("--------------2------------------------------")
print(holiday.__doc__)
print("--------------下面调用该函数看下效果-----------------------------")
holiday("111")
不使用@wraps
from functools import wraps
def wrapper(func): # func = holiday
# @wraps(func)
def inner(*args, **kwargs):
print('在被装饰的函数执行之前做的事:比如公司检查你休假前是否完成工作了,否则要求你无常加薪')
ret = func(*args, **kwargs)
print('在被装饰的函数执行之后做的事:比如检查是否带薪休假')
return ret
return inner
@wrapper # holiday = wrapper(holiday)
def holiday(day):
''' 这是一个放假通知 '''
print('全体放假%s天'%day)
return '好开心'
print("--------------1------------------------------")
print(holiday.__name__)
print("--------------2------------------------------")
print(holiday.__doc__)
print("--------------下面调用该函数看下效果-----------------------------")
holiday("111")
例子二(这个例子的permission_required是装饰test_func的):
from functools import wraps
# 用户角色权限确认
def permission_required():
def decorator(f):
@wraps(f)
def decorated_function():
return('this is decorated function')
return decorated_function
return decorator
# 管理员权限确认
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
# 用户角色权限确认
def permission_required():
def decorator(f):
#@wraps(f)
def decorated_function():
return('this is decorated function')
return decorated_function
return decorator
# 管理员权限确认
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?
最后
以上就是醉熏柜子为你收集整理的python中@wraps的作用的全部内容,希望文章能够帮你解决python中@wraps的作用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复