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
from functools import wrapsdef wrapper(func): # func = holiday@wraps(func)def inner(*args, **kwargs):print('在被装饰的函数执行之前做的事:比如公司检查你休假前是否完成工作了,否则要求你无常加薪')ret = func(*args, **kwargs)print('在被装饰的函数执行之后做的事:比如检查是否带薪休假')return retreturn 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 wrapsdef wrapper(func): # func = holiday# @wraps(func)def inner(*args, **kwargs):print('在被装饰的函数执行之前做的事:比如公司检查你休假前是否完成工作了,否则要求你无常加薪')ret = func(*args, **kwargs)print('在被装饰的函数执行之后做的事:比如检查是否带薪休假')return retreturn 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_functionreturn 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_functionreturn 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是什么意思_Python的wraps修饰器详解
标签: 本文和大家分享的主要是python 中wraps 修饰器相关内容,一起来看看吧,希望对大家 学习python有所帮助. 在了解 wraps 修饰器之前,我们首先要了解 partial ...
- python 中/ 与 //的作用、用法
python 中/ 与 //的作用.用法 原创蓝莓·山药 最后发布于2019-06-21 09:27:54 阅读数 3591 收藏 展开 python语法中, / 是除法,例如:2/3 = 0.66 ...
- python中wraps作用
functools.wraps 的作用是将原函数对象的指定属性复制给包装函数对象, 默认有 module.name.doc,或者通过参数选择. import functoolsdef itcast1( ...
- python的中文含义-python中的 * 和 ** 作用含义
python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的 一. 打包参数 * 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量 ...
- python列表迭代器_关于Python中迭代器的作用
迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...
- python中main的作用_浅析python 中__name__ = '__main__' 的作用
很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...
- 关于Python中迭代器的作用
迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...
- python迭代器好处_关于Python中迭代器的作用
迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...
- python中get函数作用_python get函数有什么作用?示例解析
这篇文章之中我们来了解一下关于python字典之中的pythonget函数的相关知识,get函数是什么意思,他有什么作用都将会在接下来的文章之中得到解答. 描述 Python 字典(Dictionar ...
最新文章
- THINKPHP 分页类
- Go 语言编程 — go-swagger OpenAPI 工具
- HTTP状态码--含义
- 大型网站演化发展历程
- 方式程0day MS17-010远程溢出漏洞测试
- Spring security/Shiro ---登陆成功后返回登陆前界面<页面重定向>
- 5分钟速成C++14多线程编程
- TextView内可以有多种样式吗?
- linux虚拟用户登录失败,用shell用户或虚拟用户登录pureftpd
- [转]NS2上实现一个简单的路由协议
- SQLSERVER 2008 R2下载安装教程
- 有限元分析基础操作(ANSYS)
- TCP/UDP常用端口号,大家快收藏
- 【网络】路由器集成锐捷认证
- vivo手机计算机怎么开语音,vivo怎么打开语音助手
- 2023年腾讯云轻量应用服务器配置价格表(CPU/系统盘/流量/节点)
- 有关上拉输入、下了输入、推挽输出、开漏输出、复用开漏输出、复用推挽输出以及、浮空输入、模拟输入区别
- 旅游行业数据可视化怎么做?快试试Smartbi一站式数据分析工具
- 推荐几款工具,提升十倍工作效率
- python生成随机数和随机矩阵