Python functools.wraps 解决了什么问题?

老明同学_6484

老明同学_6484

2026-01-18

905人浏览

原创

functools.wraps 解决了装饰器导致原函数元信息丢失的问题,自动将 name__、__doc__、__module 等关键属性从被装饰函数复制到包装函数,确保调试、帮助系统、IDE 和框架正常工作。

python functools.wraps 解决了什么问题?

functools.wraps 解决了装饰器覆盖原函数元信息的问题。

被装饰函数的 __name__、__doc__ 等属性会丢失

不使用 @wraps 时,装饰器内部通常返回一个新函数(闭包),这个新函数取代了原函数。结果是:
- func.__name__ 变成装饰器里内层函数的名字(比如 'wrapper')
- func.__doc__ 变成内层函数的文档字符串,不是原函数的
- func.__module__、func.__annotations__ 等也可能出错或为空

影响调试、帮助系统和工具链

这些元信息丢失会导致:
- help(func) 显示错误的函数名和说明
- IDE 自动补全或跳转可能指向装饰器内部,而非原始定义位置
- 日志中记录函数名变成 wrapper,难以定位实际逻辑
- 某些依赖函数签名的框架(如 Flask 路由、click 命令)可能行为异常

wraps 的作用就是批量复制关键属性

@wraps(func) 是一个装饰器工厂,它会把被装饰函数的以下属性自动拷贝到包装函数上:
- __module__
- __name__
- __qualname__
- __doc__
- __annotations__
- 还有 __dict__ 中的部分内容

本质是调用 functools.update_wrapper(wrapper, wrapped),但更简洁易用。

正确写法示例

对比两种写法:

❌ 不加 wraps:
def my_decorator(f):
    def wrapper(*args, **kwargs):
        print("before")
        result = f(*args, **kwargs)
        print("after")
        return result
    return wrapper
<p>@my_decorator
def say_hello():
"""Print hello"""
print("hello")</p>

say_hello.__name__ → 'wrapper',say_hello.__doc__ → None

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

✅ 加 wraps:

from functools import wraps
<p>def my_decorator(f):
@wraps(f)  # 关键一行
def wrapper(*args, *<em>kwargs):
print("before")
result = f(</em>args, **kwargs)
print("after")
return result
return wrapper</p>

此时 say_hello.__name__ 仍是 'say_hello',say_hello.__doc__ 正确显示 "Print hello"

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python 路由

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
flask框架如何搭建
flask框架如何搭建

搭建步骤:1、安装Python和Pip;2、创建虚拟环境;3、安装Flask;4、创建Flask应用;5、运行应用;6、访问应用。想了解更多flask框架的相关内容,可以阅读本专题下面的文章。

2024.06.27

3975

8

Python Flask框架
Python Flask框架

本专题专注于 Python 轻量级 Web 框架 Flask 的学习与实战,内容涵盖路由与视图、模板渲染、表单处理、数据库集成、用户认证以及RESTful API 开发。通过博客系统、任务管理工具与微服务接口等项目实战,帮助学员掌握 Flask 在快速构建小型到中型 Web 应用中的核心技能。

2025.08.25

6104

10

Python Flask Web框架与API开发
Python Flask Web框架与API开发

本专题系统介绍 Python Flask Web框架的基础与进阶应用,包括Flask路由、请求与响应、模板渲染、表单处理、安全性加固、数据库集成(SQLAlchemy)、以及使用Flask构建 RESTful API 服务。通过多个实战项目,帮助学习者掌握使用 Flask 开发高效、可扩展的 Web 应用与 API。

2025.12.15

316

16

python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end='\n', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.27

3140

5

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

2026.02.03

269

24

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1818

5

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

2884

5

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

2023.10.24

6204

49

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

2023.11.24

6049

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习