下面两种用法等效
1.
@functools.wraps
2.
from functools import wraps
@wraps
根据[1]:functools.wraps 旨在消除装饰器对原函数造成的影响
#--------------------------------------
这东西,扯白了就是:
就是消除副作用。
#--------------------------------------
这里的副作用指的是:
原来是holiday函数,被@wrapper 作用后,名字变成了inner,为了消除这个副作用,我们使用@wraps
#--------------------------------------
是不是非用不可?
不是
#--------------------------------------
既然不是非用不可,那为什么要使用@wraps?
设想下,你的函数设计出了错,然后报错显示是inner函数,你会摸不着头脑,这到底是对应于哪个函数啊?
用了@wraps,你马上知道是holiday函数这个环节除了问题,对于调试有帮助
附录两段代码只有一句不同:
@wraps(func)的注释与否
wraps就是个语法糖,语法糖的意思就是,不管你吃不吃糖,你都要把这中药(语法)给我喝下!
中药不是挺苦么,喝下/前,给你一颗糖。
#-----------------附录---------------------
例子一:
使用@wraps
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28from 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28from 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的):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19from 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19from 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内容请搜索靠谱客的其他文章。
发表评论 取消回复