@functools.wraps的作用

简介: @functools.wraps的作用

一、前置说明

1、本节目标

  • 了解 @functools.wraps 的作用。


2、相关回顾


二、主要内容


1、问题代码

下面是一段 不能正确显示函数名 的问题代码:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with arguments {args} and keyword arguments {kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper
@log_decorator
def add(a, b):
    return a + b
@log_decorator
def multiply(x, y):
    return x * y
add_result = add(2, 3)
print(f"add function name: {add.__name__}")  # 输出结果:add function name: wrapper
print(f"===================================")
multiply_result = multiply(4, 5)
print(f"multiply function name: {multiply.__name__}")  # 输出结果:multiply function name: wrapper


输出结果:

Calling add with arguments (2, 3) and keyword arguments {}
add returned: 5
add function name: wrapper
===================================
Calling multiply with arguments (4, 5) and keyword arguments {}
multiply returned: 20
multiply function name: wrapper


从输出结果中,可以看出,add.__name__multiply.__name__ 均没有正确的显示函数名称。


2、正确代码

为了解决这个问题,python 提供了内置的装饰器 @functools.wraps,它的作用是在自定义装饰器中,复制原始函数的元信息到装饰器返回的新函数中,从而保留原函数的属性,包括:函数名称、文档字符串、参数信息等。


下面是正确使用装饰器的代码:

def log_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with arguments {args} and keyword arguments {kwargs}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper
@log_decorator
def add(a, b):
    return a + b
@log_decorator
def multiply(x, y):
    return x * y
add_result = add(2, 3)
print(f"add function name: {add.__name__}")  # 输出结果:add function name: add
print(f"===================================")
multiply_result = multiply(4, 5)
print(f"multiply function name: {multiply.__name__}")  # 输出结果:multiply function name: multiply


输出结果:

Calling add with arguments (2, 3) and keyword arguments {}
add returned: 5
add function name: add
===================================
Calling multiply with arguments (4, 5) and keyword arguments {}
multiply returned: 20
multiply function name: multiply


三、后置说明


1、要点小结

  • 使用 Python 内置的 @functools.wraps 装饰器 ,可以复制原始函数的元信息到装饰器返回的新函数中,保留原函数的属性。
  • 正确使用自定义装饰器,需要使用 @functools.wraps 装饰在返回的新函数上。


2、下节准备

  • Python 使用类实现装饰器

点击进入《Python装饰器从入门到进阶》总目录

目录
相关文章
如何访问GitHub快的飞起?两步解决访问超时GitHub,无法访问GitHub的问题
这篇文章提供了几种方法来解决访问GitHub时速度慢或超时的问题,包括使用代理服务器、下载加速工具,以及考虑使用国内代码管理网站如码云(gitee)来加速下载GitHub上的资源。
如何访问GitHub快的飞起?两步解决访问超时GitHub,无法访问GitHub的问题
|
12月前
|
人工智能 算法 计算机视觉
昇腾AI行业案例(三):基于 AI 图像处理的铝板缺陷检测
欢迎学习《基于 AI 图像处理的铝板缺陷检测》实验。在本实验中,你将深入了解如何运用计算机视觉(CV)领域的 AI 模型,搭建一个高效精准的铝板缺陷检测系统,并利用开源数据集和昇腾 AI 芯片对模型效果加以验证。
598 0
|
负载均衡 监控 网络协议
SpringCloud之Ribbon使用
通过以上步骤,就可以在Spring Cloud项目中有效地使用Ribbon来实现服务调用的负载均衡,提高系统的可靠性和性能。在实际应用中,根据具体的业务场景和需求选择合适的负载均衡策略,并进行相应的配置和优化,以确保系统的稳定运行。
554 15
|
搜索推荐 前端开发 小程序
计算机java项目|Springboot 智能菜谱推荐系统
计算机java项目|Springboot 智能菜谱推荐系统
555 0
|
NoSQL 关系型数据库 MySQL
多机部署:打造内网服务器集群
在多机部署教程中,了解如何配置分布式应用如Laravel以使用Redis同步用户状态。关键步骤包括:修改MySQL的`bind-address`至内网IP,重启服务;同样修改Redis的`bind`,重启服务;以及调整Elasticsearch的`network.host`和`discovery.seed_hosts`,并重启。通过这些步骤,确保服务间能内网通信,实现多服务器状态同步。
482 2
|
存储 前端开发 关系型数据库
Linux 技术架构:前端、后端与数据库的完美融合
【8月更文挑战第25天】本文深入剖析了Linux操作系统的技术架构,重点介绍了前端、后端及数据库三大核心组成部分。Linux前端技术不仅涵盖了图形用户界面(GUI),包括GNOME、KDE等桌面环境,还涉及HTML、CSS、JavaScript等Web前端技术及其相关框架。后端技术则聚焦于Python、Java等多种编程语言、Apache和Nginx等Web服务器以及MySQL、PostgreSQL等数据库管理系统。Linux数据库技术覆盖了关系型和非关系型数据库,如MySQL、MongoDB等,并提供了多种数据库管理工具。
474 0
跨域问题以及经过网关二次转发重复跨域问题完美解决
跨域问题以及经过网关二次转发重复跨域问题完美解决
|
Linux Shell Swift
django(二)centos安装django3.2报错SQLite 3.8.3 or later is required (found 3.7.17)
我正在参加「掘金·启航计划」 Centos安装diango3.2框架请参照《django(一)ubuntu18.04安装框架》 在运行: 复制代码 python3 manage.py runserver 0.0.0.0:81 的时候报错: swift 复制代码 django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17). 报错的大体意思是:对sqlite最低版本的需求的3.8.3,但是现在只找到了3.7.17。
344 1
|
存储 Python
【Python 基础】“func”和“ func()”有什么区别?
【5月更文挑战第6天】【Python 基础】“func”和“ func()”有什么区别?
|
运维 编译器 API
对象存储oss使用问题之进行文件上传时报错java.io.EOFException如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
684 0