@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装饰器从入门到进阶》总目录

目录
相关文章
|
8月前
|
存储 缓存 NoSQL
除了`functools.lru_cache`装饰器,还有哪些方法可以缓存函数的结果?
除了`functools.lru_cache`装饰器,还有哪些方法可以缓存函数的结果?
51 1
|
7月前
|
Python
高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作
【6月更文挑战第20天】高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作。装饰器如`@timer`接收或返回函数,用于扩展功能,如记录执行时间。`timer`装饰器通过包裹函数并计算执行间隙展示时间消耗,如`my_function(2)`执行耗时2秒。
41 3
|
4月前
|
Python
itertools内置模块的过滤妙用
itertools内置模块的过滤妙用
25 1
|
5月前
|
C++ Python
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
python类方法中使用:修饰符@staticmethod和@classmethod的作用与区别,还有装饰器@property的使用
53 1
|
6月前
|
缓存 Python
在Python中,`functools`模块提供了一个非常有用的装饰器`lru_cache()`,它实现了最近最少使用(Least Recently Used, LRU)缓存策略。
在Python中,`functools`模块提供了一个非常有用的装饰器`lru_cache()`,它实现了最近最少使用(Least Recently Used, LRU)缓存策略。
|
7月前
|
存储 SQL 算法
【源码解析】深入解析 pandas的Block 类中算术运算和重排实现
【源码解析】深入解析 pandas的Block 类中算术运算和重排实现
|
8月前
|
缓存 Python
Python 标准库functools高阶函数用法
Python 标准库functools高阶函数用法
109 1
|
8月前
|
测试技术 Python
解释Python中的装饰器链(Decorator Chaining)。
解释Python中的装饰器链(Decorator Chaining)。
51 6
|
存储 缓存 算法
深入理解Python的`functools.lru_cache`装饰器
在 Python 中,有许多内置的装饰器可以用来增强函数或者类的功能。其中之一就是 `functools.lru_cache` 装饰器。这是一个非常有用的装饰器,它可以帮助我们优化递归函数,避免重复计算已经计算过的值。在这篇文章中,我们将探讨 `functools.lru_cache` 的工作原理以及如何使用它。
|
8月前
|
Python
Python函数式编程,map(), filter() 和 reduce() 函数的作用是什么?
Python函数式编程,map(), filter() 和 reduce() 函数的作用是什么?
79 4