当前位置: 首页 > news >正文

理解 Python 中的 @wraps:保留函数元数据

一.介绍

在本文中,我们将了解 @wraps。在 Python 中使用装饰器时,您可能会遇到原始函数的元数据丢失的情况。这时,functools 模块中的 @wraps 装饰器就可以派上用场了。让我们深入了解 @wraps 的作用及其重要性。

二.简单装饰器的问题

首先,让我们看一个不使用@wraps的简单装饰器。

def my_decorator(func):def wrapper(args, kwargs):print("Something is happening before the function is called.")result = func(args, kwargs)print("Something is happening after the function is called.")return resultreturn wrapper
@my_decorator
def say_hello(name):"""This function greets a person by name."""print(f"Hello, {name}!")
print(say_hello.__name__)
print(say_hello.__doc__)

如果您运行上述代码,您将看到以下输出。

wrapper
None

问题在于,我们原来的 say_hello 函数的名称和文档已被包装函数覆盖。这可能会导致调试、自省和文档方面的问题。

三.使用 @wraps

现在,让我们使用@wraps 修改我们的装饰器。

from functools import wraps
def my_decorator(func):@wraps(func)def wrapper(args, kwargs):print("Something is happening before the function is called.")result = func(args, kwargs)print("Something is happening after the function is called.")return resultreturn wrapper
@my_decorator
def say_hello(name):"""This function greets a person by name."""print(f"Hello, {name}!")
print(say_hello.__name__)
print(say_hello.__doc__)

现在,当您运行上述代码时,您将获得低于 O/P 的结果。

say_hello:This function greets a person by name.

四.@wraps 正在工作

@wraps 本身是一个装饰器,它更新包装函数,使其看起来像包装函数。它通过将几个属性从原始函数复制到包装函数来实现这一点,包括:

  • 姓名
  • 文档
  • 模块
  • 注释
  • 限定名称

通过保留这些属性,@wraps 可确保原始函数的元数据在装饰时不会丢失。

五.为什么要使用@wraps?

编写装饰器时使用@wraps 被认为是最佳实践,因为。

  1. 它维护准确的功能元数据,这对于文档工具和 IDE 至关重要。
  2. 它通过保留原始函数的名称和文档字符串来帮助调试。
  3. 它允许更好地反省装饰函数。

六.概括

@wraps 装饰器是 Python 中一个简单但功能强大的工具,它有助于在使用装饰器时维护函数元数据的完整性。通过将 @wraps 合并到装饰器中,您可以确保代码保持更易读、更易于调试和更易于维护。

http://www.lryc.cn/news/414458.html

相关文章:

  • cjson
  • Docker data root 目录更改
  • [CR]厚云填补_SEGDNet
  • 图-基础概念
  • Javascript前端基础面试(十)
  • 书生大模型实战营闯关记录----第五关:LlamaIndex+Internlm2 RAG实践Demo:效果对比,文档加载,向量库构建,检索器,模型推理
  • 如何使用极狐GitLab CI/CD Component Catalog?【上】
  • 详解Xilinx FPGA高速串行收发器GTX/GTP(3)--GTX的时钟架构
  • 简单搭建dns服务器
  • 大数据进阶(Advanced Big Data)
  • 微信小程序开发优惠券制作源码
  • mongodb的安装操作记录
  • C++客户端Qt开发——多线程编程(二)
  • ubuntu20复现NBV探索
  • 【51单片机仿真】基于51单片机设计的温湿度采集检测系统仿真源码文档视频——文末资料下载
  • 【Hadoop-驯化】一文学会hadoop访问hdfs中常用命令使用技巧
  • 【Spring】Bean详细解析
  • 决策树总结
  • 通俗易懂!495页看漫画学Python入门教程(全彩版)Git首发破万Star
  • websocket实现简易聊天室
  • vulhub-wordpress
  • 【机器学习算法基础】(基础机器学习课程)-10-逻辑回归-笔记
  • 自动驾驶行业知识汇总
  • C#根据反射操作对象
  • 打包python脚本(flask、jinja2)为exe文件
  • 嵌入式初学-C语言-练习三
  • 最新版Sonible Plugins Bundle v2024 winmac,简单智能,持续更新长期有效
  • J032_实现简易版的B/S架构
  • 【前端面试】五、框架
  • C语言 | Leetcode C语言题解之第316题去除重复字母