Python装饰器进阶:用闭包打造智能缓存函数
装饰器是Python中强大的语法糖,它允许在不修改原函数代码的情况下增强功能。今天我们来实现一个实用的缓存装饰器,用于优化重复计算场景的性能。
import functools
from datetime import datetime, timedelta
def cache_with_ttl(ttl_seconds=300):
"""带过期时间的缓存装饰器"""
def decorator(func):
cache = {
}
@functools.wraps(func)
def wrapper(*args, **kwargs):
# 创建缓存键
key = str(args) + str(sorted(kwargs.items()))
# 检查缓存是否有效
if key in cache:
result, timestamp = cache[key]
if datetime.now() - timestamp < timedelta(seconds=ttl_seconds):
return result
# 执行函数并缓存结果
result = func(*args, **kwargs)
cache[key] = (result, datetime.now())
return result
return wrapper
return decorator
# 使用示例
@cache_with_ttl(ttl_seconds=60) # 缓存60秒
def expensive_computation(x, y):
"""模拟耗时计算"""
import time
time.sleep(2)
return x * y + x**2
这个装饰器的核心原理是利用闭包特性,在装饰器内部维护一个缓存字典。每次调用函数时,先检查参数是否已缓存且未过期,如果是则直接返回缓存结果,避免重复计算。
关键点解析:
functools.wraps保留原函数元信息- 闭包三层结构实现参数化装饰器
- 字典键由函数参数唯一确定
- 时间戳实现TTL(生存时间)机制
适用场景:
- 数据库查询结果缓存
- API接口响应缓存
- 复杂计算结果的复用
- 减少外部服务调用频率
这种模式在Web开发、数据处理等场景中非常实用,能够显著提升程序性能。掌握装饰器的灵活运用,能让你的Python代码更加优雅高效。
装饰器的本质是函数式编程思想的体现,通过组合而非修改来扩展功能,这也是Python语言哲学的重要组成部分。