@functools.wraps的作用

一、前置说明

1、本节目标

  • 了解 @functools.wraps 的作用。

2、相关回顾

  • Python 装饰器基础
  • Python 装饰器执行过程详解

二、主要内容

1、问题代码

下面是一段 不能正确显示函数名 的问题代码:

def log_decorator(func):def wrapper(*args, **kwargs):print(f"Calling {func.__name__} with arguments {args} and keyword arguments {kwargs}")result = func(*args, **kwargs)print(f"{func.__name__} returned: {result}")return resultreturn wrapper@log_decorator
def add(a, b):return a + b@log_decorator
def multiply(x, y):return x * yadd_result = add(2, 3)
print(f"add function name: {add.__name__}")  # 输出结果:add function name: wrapperprint(f"===================================")multiply_result = multiply(4, 5)
print(f"multiply function name: {multiply.__name__}")  # 输出结果:multiply function name: wrapper

输出结果:

Calling add with arguments (2, 3) and keyword arguments {}
add returned: 5
add function name: wrapper
===================================
Calling multiply with arguments (4, 5) and keyword arguments {}
multiply returned: 20
multiply function name: wrapper

从输出结果中,可以看出,add.__name__multiply.__name__ 均没有正确的显示函数名称。

2、正确代码

为了解决这个问题,python 提供了内置的装饰器 @functools.wraps
,它的作用是在自定义装饰器中,复制原始函数的元信息到装饰器返回的新函数中,从而保留原函数的属性,包括:函数名称、文档字符串、参数信息等。

下面是正确使用装饰器的代码:


def log_decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):print(f"Calling {func.__name__} with arguments {args} and keyword arguments {kwargs}")result = func(*args, **kwargs)print(f"{func.__name__} returned: {result}")return resultreturn wrapper@log_decorator
def add(a, b):return a + b@log_decorator
def multiply(x, y):return x * yadd_result = add(2, 3)
print(f"add function name: {add.__name__}")  # 输出结果:add function name: addprint(f"===================================")multiply_result = multiply(4, 5)
print(f"multiply function name: {multiply.__name__}")  # 输出结果:multiply function name: multiply

输出结果:

Calling add with arguments (2, 3) and keyword arguments {}
add returned: 5
add function name: add
===================================
Calling multiply with arguments (4, 5) and keyword arguments {}
multiply returned: 20
multiply function name: multiply

三、后置说明

1、要点小结

  • 使用 Python 内置的 @functools.wraps 装饰器 ,可以复制原始函数的元信息到装饰器返回的新函数中,保留原函数的属性。
  • 正确使用自定义装饰器,需要使用 @functools.wraps 装饰在返回的新函数上。

2、下节准备

  • Python 使用类实现装饰器

点击进入《Python装饰器从入门到进阶》总目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/240149.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ssh远程访问及控制

目录 一、ssh协议简介 1、实现远程访问的协议和程序 2、ssh协议的概念及功能 3、ssh协议的工作原理 3.1 对称加密与非对称加密 3.1.1 对称加密(Symmetric Encryption) 3.1.2 非对称加密(Asymmetric Encryption) 3.2 公钥传…

微信商家转账到零钱怎么开通?场景模板

商家转账到零钱是什么? 使用商家转账到零钱这个功能,可以让商户同时向多个用户的零钱转账。商户可以使用这个功能用于费用报销、员工福利发放、合作伙伴货款或分销返佣等场景,提高效率。 商家转账到零钱的使用场景有哪些? 商家…

【生存技能】git操作

先下载git https://git-scm.com/downloads 我这里是win64,下载了相应的直接安装版本 64-bit Git for Windows Setup 打开git bash 设置用户名和邮箱 查看设置的配置信息 获取本地仓库 在git bash或powershell执行git init,初始化当前目录成为git仓库…

C++(13)——string

上篇文章中介绍了中部分函数的用法,本篇文章将继续对其他的函数进行介绍: 1. substr: string substr (size_t pos 0, size_t len npos) const; 函数的两个参数如上述代码所示,此函数的主要作用是根据一个已有的的对象的起始坐标开始&a…

论文笔记(四十)Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds

Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds 文章概括摘要1. 介绍2. 相关工作3. 学习 6D 抓握政策3.1 背景3.2 从点云抓取 6D 策略3.3 联合运动和抓握规划器的演示3.4 行为克隆和 DAGGER3.5 目标--辅助 DDPG3.6 对未知物体进行微调的后视目标 4. 实…

红队打靶练习:BREACH: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.110.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.110.1 00:50:56:c0:00:08 …

单片机I/O口驱动MOS管

自记录: 看完本章,串起来看,看mos驱动电路这篇:MOS管驱动电流计算以及分立器件驱动电路-CSDN博客 使用单片机做一个PLC,输出可如下两种情况: 单片机I/O口驱动,为什么一般都选用三极管而不是MOS管&#xf…

二叉树【Java】

文章目录 一、树型结构二、二叉树2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的遍历 三、二叉树的基本操作3.1获取树中节点的个数3.2获取叶子节点的个数3.3获取第K层节点的个数3.4获取二叉树的高度3.5检测值为value的元素是否存在 一、树型结构 树是一种非线性的数据…

Eclipse搭建python环境

一、下载eclipse eclipse官网下载参考链接 二、 下载PyDev ​PyDev 三、安装和配置pyDev 下载完PyDev,解压之后是下面两个文件夹,我下载的版本是PyDev 7.7 ,然后拷到eclipse对应的目录下就可以 四、然后新建一个python程序 1.新建一个项目 ​​…

三、Qt Creator 使用

关于Qt的安装及环境配置,在我的上一篇《二、QT下载、安装及问题解决(windows系统)》已经讲过了。 本章节有一个重点,在新建 工程文件时,所在路径不要有中文,否则编译及运行程序不能正常运行。 在使用Qt Creator(以下…

Redis实现全局唯一Id

一、全局唯一ID 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中,而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显 受单表数据量的限制 场景分析:如果我们的…

python/c++ Leetcode题解——118. 杨辉三角

方法一:数学 思路及解法 杨辉三角,是二项式系数在三角形中的一种几何排列。它是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。 杨辉三角具有以下性质: 1.每行数字左右对称,由…

【Python数据可视化】matplotlib之设置子图:绘制子图、子图共享x轴坐标、调整子图间距、设置图片大小

文章传送门 Python 数据可视化matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤 三、使用Core API访问与操作数据库 Sqlalchemy 的Core部分集成了DB API, 事务管理,schema描述等功能,ORM构筑于其上。本章介绍创建 Engine对象,使用基本的…

vscode无法自动补全

前提:安装c/c插件 c/c插件功能非常强大,几乎能满足日常编码过程中常用的功能;因此也包含自动补全的功能,开启方法如下: 文件->首选项->设置: 扩展->c/c->Intellisense,找到Intell…

252:vue+openlayers 绘制锥形渐变填充色的圆形

第252个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中绘制带有锥形渐变填充色的圆形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共131行)相关API参考专栏目标示例效果 </

【Android开发】不同Activity之间的数据回传实例(一)摘桃子游戏

一、功能介绍 该项目实现的功能主要有&#xff1a; 在首页显示一个按钮点击该按钮跳转到桃园页面在桃园页面&#xff0c;点击桃子会弹窗显示摘到几个桃子&#xff0c;同时被点击桃子消失&#xff0c;总桃子数1点击退出桃园会返回首页&#xff0c;首页桃子数会根据点击的桃子数…

提高支撑座效率的重要性

自动化机械设备在运行过程中需要消耗大量的能源和资源&#xff0c;提高效率意味着更有效地利用这些资源&#xff0c;降低运行成本&#xff0c;而支撑座作为自动化机械设备中重要的传动元件&#xff0c;提高支撑座的效率对于自动化机械设备的可持续发展和企业的竞争力具有重要意…

Python密码本连接wifi

有时候我们会忘记自己的Wi-Fi密码&#xff0c;或者需要连接某个Wi-Fi网络以满足合法需求。本文将介绍如何使用Python编程语言编写一个简单的连接Wi-Fi的程序。 一、密码本准备 在进行wifi猜测时&#xff0c;其实就是列出各种可能的密码&#xff0c;用来尝试去访问目标wifi&…

linux安装QQ(官方正版)

QQ官网上有支持linux系统的版本&#xff0c;所以去官网直接下载正版就好。 安装步骤&#xff1a; 1.进入官网&#xff1a;https://im.qq.com/linuxqq/index.shtml 2.选择版本&#xff1a;X86版下载dep 如下所示&#xff1a; 3.下载qq安装包&#xff1a; 4.使用命令安装qq s…