我是靠谱客的博主 醉熏柜子,这篇文章主要介绍python中@wraps的作用,现在分享给大家,希望可以做个参考。

下面两种用法等效

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
28
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

复制代码
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
28
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的):

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(104)

评论列表共有 0 条评论

立即
投稿
返回
顶部