Python 装饰器如何影响函数签名?

雨浩姑娘_3903

雨浩姑娘_3903

2026-01-18

755人浏览

原创

Python装饰器默认覆盖原函数签名(如__name__、__doc__等),因闭包函数与原函数是不同对象;用functools.wraps可自动复制元信息,确保调试、文档生成和框架反射正常。

python 装饰器如何影响函数签名?

Python 装饰器默认会覆盖原函数的签名(如 __name__、__doc__、__annotations__ 等),导致调试、文档生成、类型检查或框架反射(如 FastAPI、Flask)出错。关键在于装饰器内部返回的新函数没有继承原函数的元信息。

为什么签名会被改写?

典型装饰器返回一个闭包函数,它与原函数是完全不同的对象:

  • 新函数的 __name__ 是闭包名(如 wrapper),不是原函数名
  • __doc__ 默认为 None 或闭包自身的文档字符串
  • __annotations__、__module__、__qualname__ 等也丢失
  • 参数签名(通过 inspect.signature() 获取)变成闭包的参数,而非原函数的

如何保留原始签名?

使用 functools.wraps 是最标准、推荐的做法。它把原函数的关键属性复制到包装函数上:

from functools import wraps
<p>def my_decorator(func):
@wraps(func)  # ← 关键:自动复制 <strong>name</strong>, <strong>doc</strong>, <strong>annotations</strong> 等
def wrapper(*args, *<em>kwargs):
print("Before")
result = func(</em>args, **kwargs)
print("After")
return result
return wrapper</p><p>@my_decorator
def greet(name: str) -> str:
"""Say hello to someone."""
return f"Hello, {name}"
</p>

此时 greet.__name__ 仍是 "greet",greet.__doc__ 仍是 "Say hello to someone.",inspect.signature(greet) 也正确显示 (name: str) -> str。

Python 环境工具专业版
Python 环境工具专业版

Python 环境工具专业版功能概述Python 环境工具专业版是一项面向实际任务的技能。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。核心要点使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。执行完成后建议检查结果是否符合预期,并保留必要记录。使用与执行同时注意输入完整性、执行条件和输出可用性。从功能定位来看,该技能

下载

手动修复签名(不推荐,仅作了解)

若不用 @wraps,可手动赋值,但易遗漏:

  • wrapper.__name__ = func.__name__
  • wrapper.__doc__ = func.__doc__
  • wrapper.__annotations__ = func.__annotations__
  • wrapper.__module__ = func.__module__
  • 还需处理 __qualname__、__dict__ 等,容易出错

带参数的装饰器要注意什么?

多一层嵌套时,@wraps 仍要作用于最内层包装函数:

def repeat(times: int):
    def decorator(func):
        @wraps(func)  # ← 放在 inner wrapper 上,不是外层 decorator
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

漏掉这行,即使装饰器本身有参数,签名依然丢失。

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

4415

8

Python Flask框架
Python Flask框架

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

2025.08.25

6864

10

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

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

2025.12.15

336

16

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

2025.12.22

119

5

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

2026.02.06

594

18

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

2026.05.09

776

23

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

2026.06.16

659

12

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

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

2023.08.03

1938

5

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

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

2023.09.04

3204

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程