一篇详细介绍关于Python装饰器常用的Functools模块

文摘   2024-09-07 09:00   尼日利亚  

作者:郭震

我们探讨了装饰器的基本概念,了解了装饰器的用途与实现方式.这一篇我们将深入讨论如何使用 Python 中的 functools 模块来创建更强大与灵活的装饰器.在接下来的篇幅中,我们不仅会介绍 functools 模块的重要性,还会提供几个实际的案例,帮助大家更好地理解这些工具的应用.

functools 模块概览

functools 是 Python 标准库中的一个模块,提供了一些高阶函数和操作,用于处理可调用对象,如函数和方法.它包含了许多与函数相关的功能,其中最常用的包括:

  • wraps: 用于保留装饰器函数的元信息.
  • partial: 用于创建部分应用的函数.
  • lru_cache: 用于缓存函数结果以提高性能.

我们在创建自定义装饰器时,尤其会用到 wraps,它能确保被装饰函数的信息(如名称、文档字符串等)不会丢失.

使用 functools 创建自定义装饰器

下面我们将通过一个具体的例子,来展示如何使用 functools 模块创建一个带有计时功能的装饰器.

例子:计时装饰器

首先,让我们创建一个计算函数执行时间的装饰器:

import time
from functools import wraps

def timer_decorator(func):
    @wraps(func)  # 保持函数的元数据
    def wrapper(*args, **kwargs):
        start_time = time.time()  # 开始计时
        result = func(*args, **kwargs)  # 执行原函数
        end_time = time.time()  # 停止计时
        print(f"Function '{func.__name__}' executed in {end_time - start_time:.4f} seconds.")
        return result
    return wrapper

@timer_decorator
def example_function(n):
    total = 0
    for i in range(n):
        total += i
    return total

result = example_function(1000000)
print(f"Result: {result}")

代码解析

在上述代码中,我们定义了一个名为 timer_decorator 的装饰器.通过使用 @wraps(func),我们确保了装饰器不会改变被装饰函数的元信息.装饰器的工作机制如下:

  1. wrapper 函数中,我们使用 time.time() 记录函数开始执行的时间.
  2. 调用原函数 func(*args, **kwargs) 进行实际的计算.
  3. 再次使用 time.time() 记录函数执行结束的时间,并计算执行花费的时间.
  4. 最后我们打印函数的执行时间,并返回计算结果.

另一个例子:部分应用装饰器

functools.partial 也可以用作装饰器的一部分,下面是一个示例:

from functools import partial

def multiply(factor, number):
    return factor * number

multiply_by_two = partial(multiply, 2)  # 创建一个新的函数,固定因子为2

print(multiply_by_two(5))  # 输出 10

在这个例子中,partial 函数使我们可以创建一个新的函数 multiply_by_two,该函数将乘数固定为 2.调用 multiply_by_two(5) 时,结果为 10.

总结

在这一篇中,我们深入探讨了如何使用 Python 的 functools 模块来增强我们自定义的装饰器功能.通过案例,我们了解了如何使用 wraps 来保留原函数的元信息,以及如何利用 partial 来创建部分应用的函数.这些工具不仅提升了我们的代码可读性,也在实现复杂功能时提供了极大的便利.

长按上图二维码查看「郭震AI学习星球」

  • 更多、数据分析、爬虫、前后端开发、人工智能等教程参考.
  • 以上全文,欢迎继续点击阅读原文学习,阅读更多AI资讯,[请点击这里] https://zglg.work/


AI职场日记
AI最新消息推送
 最新文章