📜  Python| functools.wraps()函数(1)

📅  最后修改于: 2023-12-03 14:46:20.611000             🧑  作者: Mango

Python | functools.wraps()函数

简介

在Python中,使用装饰器(decorator)可以给函数添加新的功能。然而,使用装饰器也有一个常见的问题,那就是它们会造成函数签名(signature)和文档(documentation)的丢失。Python提供了functools.wraps()函数解决这个问题,它可以用来保存函数的签名和文档信息。

语法
functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)

参数:

  • wrapped:被包装的函数。必须是可调用(callable)对象。
  • assigned:需要将被包装函数的哪些属性复制到包装函数中。默认为functools.WRAPPER_ASSIGNMENTS,即('__module__', '__name__', '__qualname__', '__doc__')
  • updated:需要将被包装函数哪些属性更新到包装函数中。默认为functools.WRAPPER_UPDATES,即('__dict__',)

返回值:

返回一个包装器函数,用于包装被装饰的函数。

示例
import functools

def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        """这是wrapper函数的文档字符串"""
        print('调用被装饰函数之前')
        res = func(*args, **kwargs)
        print('调用被装饰函数之后')
        return res
    return wrapper

@my_decorator
def my_func(x, y):
    """这是my_func函数的文档字符串"""
    return x + y

print(my_func(1, 2))
print(my_func.__name__)
print(my_func.__doc__)

输出:

调用被装饰函数之前
调用被装饰函数之后
3
my_func
这是my_func函数的文档字符串

注释:

  • @functools.wraps(func)语句使用functools.wraps()函数包装了装饰器内部的wrapper()函数,这样wrapper函数就会继承被装饰函数的签名和文档信息。
  • my_func(1, 2)的执行过程中实际调用的是wrapper(1, 2)函数,这个函数在调用被装饰函数之前和之后都会打印一句话。