Python 装饰器 @wraps()

装饰器(Decorator)

在 Python 中,装饰器是一个特殊的函数,它可以修改或扩展另一个函数的行为。装饰器是一个小函数,它接受另一个函数作为参数,并返回一个新的函数,该新的函数“包装”了原始函数。

元数据丢失问题

当你创建一个装饰器时,你实际上是创建了一个新的函数,该函数调用原始函数。然而,这个新的函数不会继承原始函数的元数据(例如名称、文档字符串、参数)。这可能会导致问题,例如使用 help() 或 inspect 模块来检查函数的元数据时。

wraps 的作用

wraps 装饰器来自 functools 模块,它可以解决元数据丢失的问题。当你使用 wraps 来装饰一个装饰器时,它将确保原始函数的元数据被复制到新的函数中。

让我们来探讨如果不使用 @wraps() 装饰器时会发生什么情况。😊

不使用 @wraps() 的结果

如果不使用 @wraps() 装饰器,原始函数的元数据(例如函数名、文档字符串、参数签名)将不被保留。这可能会导致以下问题:

  1. 函数名和文档字符串丢失:装饰后的函数将具有不同的函数名和文档字符串,这可能会使函数的目的和行为不明确。
  2. 参数签名不正确:装饰后的函数的参数签名将不匹配原始函数的参数签名,这可能会导致调用函数时的错误。
  3. 调试困难:当错误发生时,调试器将显示装饰后的函数名和签名,而不是原始函数的名称和签名,使得错误的来源难以确定。

代码示例

def MyDecorator(func):
    def wrapper(*args, **kwargs):
        print("函数调用前发生了什么。")
        result = func(*args, **kwargs)
        print("函数调用后发生了什么。")
        return result
    return wrapper

@MyDecorator
def add(a, b):
    """加两个数字"""
    return a + b

print(add.__name__)  # 输出:wrapper
print(add.__doc__)  # 输出:None
help(add)  # 输出:没有文档可用

如你所见,装饰后的函数 丢失了其原始函数名和文档字符串。这可能会导致代码维护和调试困难。

使用 @wraps() 的结果

相比之下,如果使用 @wraps() 装饰器,原始函数的元数据将被保留,避免了上述问题。

from functools import wraps

def MyDecorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        print("函数调用前发生了什么。")
        result = func(*args, **kwargs)
        print("函数调用后发生了什么。")
        return result
    return wrapper

@MyDecorator
def add(a, b):
    """加两个数字"""
    return a + b

print(add.__name__)  # 输出:add
print(add.__doc__)  # 输出:加两个数字
help(add)  # 输出:正确的文档

使用 @wraps() 后,装饰后的函数 add 保留了其原始函数名和文档字符串,避免了代码维护和调试困难。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cesium中实现镜头光晕

镜头光晕 镜头光晕 (Lens Flares) 是模拟相机镜头内的折射光线的效果,主要作用就是让太阳光/其他光源更加真实,和为您的场景多增添一些气氛。 Cesium 中实现 其实 Cesium 里面也是有实现一个镜头光晕效果的,添加方式如下,只是效…

Leetcode - 周赛393

目录 一,3114. 替换字符可以得到的最晚时间 二,3115. 素数的最大距离 三,3116. 单面值组合的第 K 小金额 四, 3117. 划分数组得到最小的值之和 一,3114. 替换字符可以得到的最晚时间 本题是一道模拟题,…

泛型的初步认识(1)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…

标准版uni-app移动端页面添加/开发操作流程

页面简介 uni-app项目中,一个页面就是一个符合Vue SFC规范的.vue文件或.nvue文件。 .vue页面和.nvue页面,均全平台支持,差异在于当uni-app发行到App平台时,.vue文件会使用webview进行渲染,.nvue会使用原生进行渲染。…

HCIP的学习(10)

OSPF不规则区域划分 区域划分 非骨干与骨干区域直接相连骨干区域唯一 限制规则: 非骨干区域之间不允许直接相互发布区域间路由信息OSPF区域水平分割:从非骨干区域收到的路由信息,ABR设备能接收到不能使用(从某区域传出的路由&…

全新升级轻舟知识付费系统引流变现至上利器

知识付费系统:引流变现至上利器 本系统参考各大主流知识付费系统,汇总取其精华,自主研发,正版授权系统。 我们给你搭建搭建一个独立运营的知识付费平台,搭建好之后,你可以自由的运营管理。网站里面的名称…

【机器学习】分类与预测算法评价的方式介绍

一、引言 1、机器学习分类与预测算法的重要性 在数据驱动的时代,机器学习已经成为了处理和分析大规模数据的关键工具。分类与预测作为机器学习的两大核心任务,广泛应用于各个领域,如金融、医疗、电商等。分类算法能够对数据进行有效归类&…

web前端网络相关知识

一、OSI 7层参考模型 1.物理层(光纤、电缆等物理介质) 传播比特流(bit) 01010101的形式 2.数据链路层(交换机,mac地址) 将比特流组合成字节,组合成帧,用mac地址访问&…

bugku-web-login2

这里提示是命令执行 抓包发现有五个报文 其中login.php中有base64加密语句 $sql"SELECT username,password FROM admin WHERE username".$username.""; if (!empty($row) && $row[password]md5($password)){ } 这里得到SQL语句的组成,…

CRMEB PRO安装系统配置清单

统在安装完成之后,需要对系统进行一系列的配置,才能正常使用全部的功能,以下是官方整理的配置清单

Xinstall带你进入一键通过URL打开App的新时代

在移动互联网时代,App已经成为我们日常生活中不可或缺的一部分。然而,在使用App的过程中,我们常常会遇到一些烦恼。比如,当我们通过一个网页链接想要打开对应的App时,往往需要先复制链接,然后在App中粘贴&a…

2024的新宠儿——Mamba(1):SSM

引言 自 2017 年被提出以来,Transformer 已经成为 AI 大模型的主流架构,但随着模型规模的扩展和需要处理的序列不断变长,Transformer 的局限性也逐渐凸显。一个很明显的缺陷是:Transformer 模型中自注意力机制的计算量会随着上下文长度的增加呈平方级增长,比如上下文增加 …

多模态之ALBEF—先对齐后融合,利用动量蒸馏学习视觉语言模型表征,学习细节理解与论文详细阅读:Align before Fuse

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation (ALBEF)在融合之前对齐:利用动量蒸馏进行视觉与语言表示学习 Paper: arxiv.org/pdf/2107.07651.pdf Github: https://github.com/salesforce/…

用云手机运营TikTok有什么好处?

在数字化浪潮的推动下,社交媒体平台正重塑商业推广与品牌建设的面貌。TikTok,这款全球热门的短视频应用,已经吸引了亿万用户的瞩目。对于出海电商和品牌推广而言,借助云手机运营TikTok,能够解锁更多潜在可能&#xff0…

Linux:进程调度

Linux:进程调度 进程优先级查看优先级调整优先级 Linux 2.6 内核进程调度队列 进程优先级 查看优先级 在Linux中,进程是有优先级的,我们可以通过指令ps -la来查看: 其中PRI表示priority优先级,在Linux中,…

第九、十章 异常、模块、包以及数据可视化

第九章 异常、模块、包 异常 捕获异常 捕获常规异常 # 捕获常规异常 try:f open("D:/abc.txt", "r", encoding "UTF-8") except:print("出现异常了,因为文件不存在,我将open的模式,改为w模式去打开&qu…

docker灵活部署mysql

博客简要 用docker部署mysql,并将数据库映射到主机上,并增加远端访问mysql数据库 当你使用Docker运行MySQL时,并且希望将MySQL数据库的数据存储在宿主机(也就是运行Docker的主机)上的特定路径,你需要在启动容器时通过…

windows下vscode调试虚拟机linux c++工程的三种方法

vscode去远程调试方法有很多种,不同的插件对应了不同的调试方法,比如: 1.C/C插件进行GDB调试(编写launch.json文件) 2.C/C Runner插件 3.CMake Tools插件(只针对CMake工程,需要搭配C/C插件一起使用,但无…

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面 由纯JS实现 html代码 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-C…

论文精读--Learning Efficient Object Detection Models with Knowledge Distillation

在目标检测任务中&#xff0c;存在特殊的挑战&#xff1a; &#xff08;1&#xff09;目标检测任务标签信息量更大&#xff0c;根据标签学到的模型更为复杂&#xff0c;压缩后损失更多 &#xff08;2&#xff09;分类任务中&#xff0c;每个类别相对均衡&#xff0c;同等重要…
最新文章