@wraps(func)

news/2025/10/15 17:34:19/文章来源:https://www.cnblogs.com/wangya216/p/19143872

@wraps(func) 是 Python 标准库 functools 模块提供的一个装饰器,主要用于保留被装饰函数的元信息(metadata)。当我们使用自定义装饰器包装函数时,被装饰后的函数会丢失原函数的名称、文档字符串等信息,而 @wraps(func) 可以解决这个问题。

为什么需要 @wraps(func)

先看一个不使用 @wraps 的例子,观察装饰器对函数元信息的影响:

def my_decorator(func):def wrapper(*args, **kwargs):"""这是 wrapper 函数的文档字符串"""return func(*args, **kwargs)return wrapper@my_decorator
def original_func():"""这是原函数的文档字符串"""print("原函数执行")# 查看被装饰后的函数信息
print("函数名:", original_func.__name__)  # 输出:wrapper(而非 original_func)
print("文档字符串:", original_func.__doc__)  # 输出:这是 wrapper 函数的文档字符串(而非原函数的)

可以看到,被装饰后的 original_func 实际上变成了 wrapper 函数,因此它的元信息(__name____doc__ 等)也被替换成了 wrapper 的信息。这会导致:

  • 调试时难以识别函数身份;
  • 生成文档时无法正确提取原函数的说明;
  • 依赖函数元信息的代码(如反射)出现异常。

@wraps(func) 的作用

@wraps(func) 的本质是将原函数 func 的元信息“复制”到装饰器内部的 wrapper 函数上,让 wrapper 函数看起来更像原函数。

修改上面的例子,添加 @wraps(func)

from functools import wrapsdef my_decorator(func):@wraps(func)  # 保留原函数元信息def wrapper(*args, **kwargs):"""这是 wrapper 函数的文档字符串"""return func(*args, **kwargs)return wrapper@my_decorator
def original_func():"""这是原函数的文档字符串"""print("原函数执行")# 再次查看被装饰后的函数信息
print("函数名:", original_func.__name__)  # 输出:original_func(正确保留)
print("文档字符串:", original_func.__doc__)  # 输出:这是原函数的文档字符串(正确保留)

此时,original_func 的元信息被正确保留,解决了装饰器导致的元信息丢失问题。

@wraps 复制的元信息包括:

@wraps 会将原函数的以下核心元信息复制到 wrapper 函数:

  • __name__:函数名称;
  • __doc__:文档字符串(docstring);
  • __module__:函数所在的模块;
  • __annotations__:函数的参数和返回值注解;
  • __defaults__:函数的参数默认值;
  • 其他与函数身份相关的属性。

实际应用场景

@wraps 在以下场景中尤为重要:
1.** 调试 :确保调试工具(如 pdb)显示的是原函数名,而非 wrapper
2.
文档生成 :自动文档工具(如 Sphinx)能正确提取原函数的文档字符串;
3.
装饰器嵌套 :多层装饰器时,保留元信息可避免身份混淆;
4.
依赖元信息的框架 **:某些框架(如 Flask、Django)会通过函数名或文档字符串实现特定功能,需确保元信息正确。

总结

@wraps(func) 是装饰器开发中的“最佳实践”,它的作用是保留被装饰函数的元信息,避免因装饰器包装导致函数身份、文档等信息丢失。使用时只需将其放在装饰器内部的 wrapper 函数上方,并传入原函数 func 作为参数即可。

在之前的“递归计时器装饰器”中,@wraps(func) 确保了被装饰的递归函数(如 factorialfibonacci)在调试或查看元信息时,仍能正确显示其原始名称和文档,而不是内部的 wrapper 函数信息。

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

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

相关文章

antdx 如何接入dify

antdx 如何接入difyimport { UserOutlined } from @ant-design/icons; import { Bubble, Sender, useXAgent, useXChat } from @ant-design/x; import { Flex, type GetProp } from antd; import React from react;con…

递归函数的精确时间统计

import time from functools import wrapsdef recursion_timer(func):"""装饰器:用于统计递归函数的总执行时间"""# 闭包变量:跟踪是否已经开始计时和开始时间is_timing = Falsestart…

[HZOI]CSP-S模拟32

CSP-S模拟32 今天打的要睡着了,根本没有大脑可以思考小 Z 专场!(是谁不重要,无限 %%% )T1 小 Z 爱计数 是 签到题 ,差点挂掉的签到题。 题意:有三种操作(+1、-1、归零),给定 n 个询问,问存不存在一种情况满足…

大素材毕业设计选题推荐-基于大数据的全球经济指标数据分析与可视化环境-Hadoop-Spark-数据可视化-BigData

大素材毕业设计选题推荐-基于大数据的全球经济指标数据分析与可视化环境-Hadoop-Spark-数据可视化-BigData2025-10-15 16:52 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: n…

D. MAD Interactive Problem

View PostD. MAD Interactive ProblemD. MAD Interactive Problem Problem - D - Codeforces 我们可以进行如下操作: ① 从左到右将 \(i(1 \le i \le 2n)\) 放入 \(s\),然后查询 \(s\),如果答案是某个数字,那么 \(…

在 gitea 服务器端查询 lfs 文件占用情况

1、使用数据库管理工具打开 gitea 的数据库(如 sqlite 模式下:db/gogs.db) 2、执行以下 SQL 语句: SELECTr.owner_name || / || r.name AS repo_name,m.oid,printf(%.2f MB, m.size / 1024.0 / 1024.0) AS size_mb…

HDR图像生成算法详解

HDR技术概述 高动态范围(HDR)图像生成是通过合成多张不同曝光度的图像,来捕捉超出传统显示设备范围的亮度信息。以下是主要的HDR生成算法及其MATLAB实现。 HDR成像基本原理 动态范围定义 动态范围 = 最大可记录亮度…

Introduction: Why Optimization?

在接触凸优化课程当中十分感到头疼,所以在网上搜寻各种资源,发现一位前辈撰写的自己学习凸优化的过程。我的凸优化学习之路 | 韩鼎の个人网站于是想也要慢慢啃下这块难啃的骨头。 引言:为什么要优化? 主要原因是在…

基于MATLAB的二自由度机械臂PID控制仿真

一、动力学建模(拉格朗日方程) 1. 机械臂参数定义 % 机械臂参数(单位:kgm) m1 = 2.0; m2 = 1.5; % 连杆质量 l1 = 0.8; l2 = 0.6; % 连杆长度 I1 = 0.16; I2 = 0.063; % 转动惯量 g = 9.81; % 重力加速度2. 正运动…

Spring AOP原理

目录1. AOP核心概念2. 动态代理机制(1)JDK动态代理(2)CGLIB动态代理3. AOP执行流程4. 与AspectJ的关系总结 Spring AOP(面向切面编程)是Spring框架的核心特性之一,它基于动态代理和字节码增强技术实现,能够在不…

Azure VM (46) 分布式tcping监控

Azure VM (46) 分布式tcping监控《Windows Azure Platform 系列文章目录》具体的项目在我的github里:https://github.com/leizhang1984/pingmesh

Ventoy引导Kali live USB持久化

Ventoy 引导 Kali Live USB 持久化Ventoy 引导 Kali Live USB 持久化Ventoy 介绍 使用 Ventoy 替代 ISO 写盘 Ventoy 数据持久化插件简述 创建 Live 系统持久化文件 创建数据交换分区参考Ventoy 介绍 以下介绍来自 Ven…

知识库管理工具深度测评:ONES、Confluence 等10款工具全面对比

在数字化转型浪潮下,企业越来越重视知识资产的沉淀与共享。根据 Gartner 发布的《Knowledge Management Market Guide 2024》,全球超过85%的中大型组织已经采用知识库管理工具(Knowledge Base Management Tools)来…

从SGD到AdamW:深度学习优化器演进全解析与实践指南

从SGD到AdamW:深度学习优化器演进全解析与实践指南从SGD到AdamW:深度学习优化器演进全解析与实践指南 摘要 在深度学习中,优化器(Optimizer)是连接模型与数据的桥梁,它负责根据损失函数的梯度来更新模型的参数,…

【面试题】人工智能工程师高频面试题汇总:循环神经网络篇(题目+答案)

后台私信雯雯老师,备注:循环神经网络,领取更多相关面试题 随着人工智能技术的突飞猛进,AI工程师成为了众多求职者梦寐以求的职业。想要拿下这份工作,面试的时候得展示出你不仅技术过硬,还得能解决问题。所以,提…

做了个手机上的“视频播放器”,获益匪浅

先上代码再解释踩过的坑。<html><head><meta charset="UTF-8"> <meta name="screen-orientation" content="landscape"> <meta name="viewport" …

CEF关闭流程

整理了一下之前写的cef推荐的关闭流程的文档 参考文档和实际demo来看,关闭流程离屏渲染和非离屏渲染时不同的,主要区别在于非离屏渲染有一个cef自建的窗口,非离屏渲染的退出和这个窗口密切相关。 CefBrowserHost::T…

AI一周资讯 251005-251015

OpenAI 2025开发者大会:多款新模型与工具重磅发布 OpenAI在2025年开发者大会上发布了一系列新模型和新工具。AgentKit是面向开发者和企业构建、部署和优化智能体的工具集,含Agent Builder、Connector Registry等组件…

2025 年中空百叶源头厂家最新推荐排行榜:聚焦国内优质供货商,助力客户精准选购可靠产品光能/光伏/电动/光动中空百叶厂家推荐

随着建筑门窗行业对遮阳、节能与采光需求的不断提升,中空百叶产品市场需求持续增长,但市场上厂家资质、产品质量差异显著。部分厂家技术落后、产能不足,难以保障大型项目供货;还有些厂家售后体系不完善,导致客户采…

2025年学校家具定制厂家最新权威推荐榜:全屋定制/衣柜/厨柜/酒柜/鞋柜/猫柜/酒店办公家具/电视柜/书包柜/图书架/宿舍上下床

2025年学校家具定制厂家最新权威推荐榜:全屋定制/衣柜/厨柜/酒柜/鞋柜/猫柜/酒店办公家具/电视柜/书包柜/图书架/宿舍上下床随着教育现代化进程的加速推进,学校家具定制行业正迎来新一轮发展机遇。2025年,教育机构对…