Python functools.wraps 详解
标准库 functools 中的 wrap 函数用于包装函数, 不改变原有函数的功能, 仅改变原有函数的一些属性, 例如 __name__
, __doc__
, __annotations__
等属性
先看一个简单的示例
import functoolsdef func_1(x: str) -> None:"""function:return: None"""print("func_1", x)@functools.wraps(func_1)
def demo():"""demo:return: None"""print("demo")print("demo name:", demo.__name__)
print("demo doc:", demo.__doc__)
print("demo annotations:", demo.__annotations__)
demo()
print("func_1 is demo's wrap:", func_1 is demo.__wrapped__)
输出
demo name: func_1
demo doc: function:return: Nonedemo annotations: {'x': <class 'str'>, 'return': None}
demo
func_1 is demo's wrap: True
使用 func_1 去包装 demo 函数, demo 函数本身的功能没变(仍打印 “demo”), 但是 __name__(函数名称), __doc__(函数文档), __annotations__(函数注释) 等属性变了, 而且 __wrapped__ 属性指向包装函数
functools.wrap
可用于装饰器的内层函数, 抵消装饰器的副作用, 因为使用装饰器后, 原函数被内层函数赋值覆盖, 函数名称等信息丢失了(装饰器仅仅是不改变函数原有功能)
def info(func):def wrap(a, b):return func(a, b)return wrap@info
def multiply(x, y):return x * yprint("multiply name:", multiply.__name__)
打印
multiply name: wrap
使用装饰器后, multiply 指向内层函数 wrap, 所以名称变为 wrap
可以对内层函数进行包装
def info(func):@functools.wraps(func)def wrap(a, b):return func(a, b)return wrap@info
def multiply(x, y):return x * yprint("multiply name:", multiply.__name__)
输出
multiply name: multiply
@info 装饰器等价于 multiply = info(multiply)
, 所以 func 指向原始 multiply 函数, @functools.wraps(func)
使用原始 multiply 函数包装 wrap 函数, 随后 wrap 函数覆盖原始 multiply 函数
注意 wrap 函数与原始 multiply 函数形参必须兼容
Python functools.wraps 详解相关推荐
- python functools 使用详解
文章目录 1.functools.cmp_to_key(func) 2.@functools.lru_cache(maxsize=128, typed=False) 3.functools.parti ...
- python协程详解
目录 python协程详解 一.什么是协程 二.了解协程的过程 1.yield工作原理 2.预激协程的装饰器 3.终止协程和异常处理 4.让协程返回值 5.yield from的使用 6.yield ...
- Python中lambda详解(包括内置函数map、reduce、filter、sorted、max)
文章目录 一.lambda是什么? 1.lambda语法 2.语法详解 二.lambda的使用 1.定义 2.调用 3.替换 4.作返回值 三.lambda作参数 1.map函数 2.reduce函数 ...
- python20191031_20191031:Python取反运算详解
20191031:Python取反运算详解 取反运算:~3 == 4 1.对于数字 3 =======>转换为二进制表示为011 2.对011取反为100 3.为什么表示-4 a.计算机用补码表 ...
- Python字符编码详解
Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...
- python的执行过程_在交互式环境中执行Python程序过程详解
前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...
- python functools.wraps functools.partial实例解析
一:python functools.wraps 实例 1. 未使用wraps的实例 #!/usr/bin/env python # coding:utf-8def logged(func):def ...
- windows上安装Anaconda和python的教程详解
一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...
- python变量类型-Python 变量类型详解
变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...
最新文章
- 强化学习AI:它菜了,我慌了
- SAP MM ME57界面看到的供应源跟Source List主数据不一致?
- Hibernate的批量查询
- Github使用初体验2018.08.07
- 微信(QQ)截图时,无法保留鼠标右键菜单选项内容
- 设计模式学习笔记-基础知识篇
- 六自由度机器人逆向运动学_【课程笔记】Notes for Robotics/机器人学 (Part1)
- 论文浅尝 | Tree-to-sequence 学习知识问答
- 3-25Pytorch与张量填充3-26Pytorch与傅里叶变化
- 水稻细菌性条斑病的分割与严重程度估计方法
- python中else与if的匹配原则是什么_if-else语句中,if和else的配对原则各是什么
- C#给图片加文字水印
- MyBatis开发经验总结
- MATLAB 产生线性调频信号
- linux支持usb打印机
- 【华为机试真题 JAVA】最大股票收益-100
- 二极管计算机原理,二极管的原理
- ..java.lang.IllegalStateException: Content has been consumed..
- windows防火墙规则_如何在Windows防火墙中创建高级防火墙规则
- 用英雄联盟的方式讲解JavaScript设计模式!
热门文章
- javaWeb书城管理系统
- 测试cpu玩游戏的软件,玩游戏,CPU究竟需要几核心?实测带给你结果!
- JDK各版本资源下载(1.7以及以上版本)
- echarts自定义tooltip
- EasyCVR分发出来的流播放花屏的问题处理方法
- find7 android 5,没开玩笑 OPPO Find 5抵价1200换Find 7
- spring容器启动事件和关闭事件
- 【那千古永恒不变的信念】
- mapboxGL2中Terrain的离线化应用
- linux 辅助ip地址到文本,技术|如何在 Ubuntu 系统中添加一个辅助 IP 地址