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

目录
相关文章
|
1天前
|
存储 缓存 NoSQL
除了`functools.lru_cache`装饰器,还有哪些方法可以缓存函数的结果?
除了`functools.lru_cache`装饰器,还有哪些方法可以缓存函数的结果?
20 1
|
1天前
|
缓存 Python
Python 标准库functools高阶函数用法
Python 标准库functools高阶函数用法
40 1
|
1天前
|
测试技术 Python
解释Python中的装饰器链(Decorator Chaining)。
解释Python中的装饰器链(Decorator Chaining)。
20 6
|
1天前
|
测试技术 开发者 Python
Python中的装饰器(Decorators)原理与应用解析
在Python编程中,装饰器(Decorators)是一种强大的工具,能够灵活地扩展函数或类的功能,提高代码的可复用性和可维护性。本文将深入探讨装饰器的原理、使用方法以及常见应用场景,帮助读者更好地理解和运用这一重要的Python特性。
|
8月前
rxjs 操作符 pairwise 的一个例子
rxjs 操作符 pairwise 的一个例子
41 0
rxjs 操作符 pairwise 的一个例子
|
10月前
|
存储 缓存 算法
深入理解Python的`functools.lru_cache`装饰器
在 Python 中,有许多内置的装饰器可以用来增强函数或者类的功能。其中之一就是 `functools.lru_cache` 装饰器。这是一个非常有用的装饰器,它可以帮助我们优化递归函数,避免重复计算已经计算过的值。在这篇文章中,我们将探讨 `functools.lru_cache` 的工作原理以及如何使用它。
|
1天前
|
Python
Python函数式编程,map(), filter() 和 reduce() 函数的作用是什么?
Python函数式编程,map(), filter() 和 reduce() 函数的作用是什么?
|
1天前
|
数据安全/隐私保护 Python
解释装饰器(decorator)的功能和用法。
解释装饰器(decorator)的功能和用法。
|
5月前
|
Python
python functools.wraps保留被装饰函数属性
python functools.wraps保留被装饰函数属性
30 0
|
5月前
|
缓存 Python
Python中的装饰器进阶:使用functools库提升装饰器的灵活性
装饰器是Python中强大而灵活的工具,它允许你在不修改函数代码的情况下,增强函数的功能。在本文中,我们将深入研究装饰器,并介绍如何使用`functools`库提升装饰器的灵活性和功能