下面两种用法等效

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的作用相关推荐

  1. python中wraps是什么意思_Python的wraps修饰器详解

    标签: 本文和大家分享的主要是python 中wraps 修饰器相关内容,一起来看看吧,希望对大家 学习python有所帮助. 在了解  wraps  修饰器之前,我们首先要了解  partial   ...

  2. python 中/ 与 //的作用、用法

    python 中/ 与 //的作用.用法 原创蓝莓·山药 最后发布于2019-06-21 09:27:54 阅读数 3591  收藏 展开 python语法中, / 是除法,例如:2/3 = 0.66 ...

  3. python中wraps作用

    functools.wraps 的作用是将原函数对象的指定属性复制给包装函数对象, 默认有 module.name.doc,或者通过参数选择. import functoolsdef itcast1( ...

  4. python的中文含义-python中的 * 和 ** 作用含义

    python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的 一. 打包参数 * 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量 ...

  5. python列表迭代器_关于Python中迭代器的作用

    迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...

  6. python中main的作用_浅析python 中__name__ = '__main__' 的作用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  7. 关于Python中迭代器的作用

    迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...

  8. python迭代器好处_关于Python中迭代器的作用

    迭代器的定义:含有__iter__()方法和__next__()方法的就是迭代器,即(iterate) 含有__iter__()方法就可以使用for循环,即iterable(可迭代的) Iterabl ...

  9. python中get函数作用_python get函数有什么作用?示例解析

    这篇文章之中我们来了解一下关于python字典之中的pythonget函数的相关知识,get函数是什么意思,他有什么作用都将会在接下来的文章之中得到解答. 描述 Python 字典(Dictionar ...

最新文章

  1. THINKPHP 分页类
  2. Go 语言编程 — go-swagger OpenAPI 工具
  3. HTTP状态码--含义
  4. 大型网站演化发展历程
  5. 方式程0day MS17-010远程溢出漏洞测试
  6. Spring security/Shiro ---登陆成功后返回登陆前界面<页面重定向>
  7. 5分钟速成C++14多线程编程
  8. TextView内可以有多种样式吗?
  9. linux虚拟用户登录失败,用shell用户或虚拟用户登录pureftpd
  10. [转]NS2上实现一个简单的路由协议
  11. SQLSERVER 2008 R2下载安装教程
  12. 有限元分析基础操作(ANSYS)
  13. TCP/UDP常用端口号,大家快收藏
  14. 【网络】路由器集成锐捷认证
  15. vivo手机计算机怎么开语音,vivo怎么打开语音助手
  16. 2023年腾讯云轻量应用服务器配置价格表(CPU/系统盘/流量/节点)
  17. 有关上拉输入、下了输入、推挽输出、开漏输出、复用开漏输出、复用推挽输出以及、浮空输入、模拟输入区别
  18. 旅游行业数据可视化怎么做?快试试Smartbi一站式数据分析工具
  19. 推荐几款工具,提升十倍工作效率
  20. python生成随机数和随机矩阵

热门文章

  1. 静态工厂方法之服务提供者框架
  2. PERL 实现微信登录
  3. XCTF-高手进阶区:ics-04
  4. CG-CTF-Web-单身一百年
  5. 数字密码输入框对输入内容进行隐藏
  6. 如何用python批量下载数据_使用Python批量下载数据
  7. 设置输入框placeholder文字颜色
  8. nw.js启动时白屏
  9. 微信小程序点击按钮实现手机振动功能
  10. Kafka系统的组件、角色以及和zookeeper的关系