详细分析Python中的@wraps(func)基本知识(附Demo)

前言

  1. 对于装饰器的基本知识推荐阅读:详细分析Python装饰器(附Demo)
  2. 对于*args, **kwargs的理解:Python关于 *args 和 **kwargs 参数的详解(全)

没有使用@wraps(func)的Demo:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        """这是装饰器内部的包装函数"""
        print("Before calling the function")
        result = func(*args, **kwargs)
        print("After calling the function")
        return result
    return wrapper

@my_decorator
def say_hello():
    """这是原始的 say_hello 函数"""
    print("Hello!")

print(say_hello.__name__)  # 输出包装函数的名称,而不是原始函数的名称
print(say_hello.__doc__)   # 输出包装函数的文档字符串,而不是原始函数的文档字符串

截图如下:

在这里插入图片描述

未使用 @wraps(func) 装饰器时,被装饰的函数会丢失原始函数的元数据,包括函数名和文档字符串

1. 基本知识

在Python中,@wraps(func) 是一个装饰器,用于帮助保留被装饰函数的元数据。它实际上是一个装饰器工具,来自于 functools 模块,用于解决使用装饰器时可能出现的一些问题,比如丢失被装饰函数的名称、文档字符串、参数签名等

@wraps(func) 装饰器的作用包括

  • 保留函数元数据: 装饰器在包装被装饰函数时会改变函数的一些属性,例如函数名、文档字符串等。使用 @wraps(func) 装饰器可以确保包装后的函数保留原始函数的元数据,使得调试、文档生成等更加方便

  • 提高可读性: 在使用装饰器时,如果不使用 @wraps(func) 装饰器,可能会导致装饰后的函数失去原函数的一些信息,这会降低代码的可读性。通过使用 @wraps(func) 装饰器,可以使得装饰后的函数更具可读性,更接近原始函数

2. Demo

结合前言给出的Demo,看如下Demo(保留元数据):

from functools import wraps

def my_decorator(func):
    @wraps(func)  # 使用 @wraps 装饰器
    def wrapper(*args, **kwargs):
        """这是装饰器内部的包装函数"""
        print("Before calling the function")
        result = func(*args, **kwargs)
        print("After calling the function")
        return result
    return wrapper

@my_decorator
def say_hello():
    """这是原始的 say_hello 函数"""
    print("Hello!")

print(say_hello.__name__)  # 输出原始函数的名称
print(say_hello.__doc__)   # 输出原始函数的文档字符串

截图如下:

在这里插入图片描述
总的来说:

使用了 @wraps(func) 装饰器,输出的函数名和文档字符串分别是原始函数的名称和文档字符串

再附上相关的Demo:

from functools import wraps

def log_parameters_with_wraps(func):
    @wraps(func)  # 使用 @wraps 装饰器
    def wrapper(*args, **kwargs):
        """这是装饰器内部的包装函数"""
        print(f"Arguments: {args}, Keyword arguments: {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@log_parameters_with_wraps
def multiply(x, y):
    """这是原始的 multiply 函数"""
    return x * y

# 调用 multiply 函数并传递关键字参数
multiply(10, y=20)


print(multiply.__name__)  # 输出函数名,应该是原始函数的名称
print(multiply.__doc__)   # 输出函数文档字符串,应该是原始函数的文档字符串

截图如下:

在这里插入图片描述

相关推荐

  1. 详细分析Vue3卡槽知识点(Demo

    2024-03-18 22:54:01       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-18 22:54:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-18 22:54:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-18 22:54:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-18 22:54:01       18 阅读

热门阅读

  1. 从零开始学HCIA之网络自动化01

    2024-03-18 22:54:01       22 阅读
  2. 我手写的轮子开源了

    2024-03-18 22:54:01       19 阅读
  3. http模块 之 如何创建一个http服务?

    2024-03-18 22:54:01       19 阅读
  4. C语言——对称矩阵的判定

    2024-03-18 22:54:01       22 阅读
  5. 王道c语言-100元有几种换法

    2024-03-18 22:54:01       17 阅读
  6. LEETCODE3

    LEETCODE3

    2024-03-18 22:54:01      20 阅读
  7. linux课程_认识,基本命令

    2024-03-18 22:54:01       21 阅读
  8. web蓝桥杯真题:时间管理大师

    2024-03-18 22:54:01       21 阅读
  9. 基于SpringBoot+Druid实现多数据源:baomidou多数据源

    2024-03-18 22:54:01       17 阅读
  10. centos系统ssh7.4升级9.6

    2024-03-18 22:54:01       17 阅读