装饰器内功:闭包变量捕获与运行时优化技术
深入装饰器实现的闭包机制,学习如何捕获外部变量、使用 nonlocal 实现有状态装饰器,以及通过函数属性缓存优化装饰器链性能。 · 难度:入门 · +10XP
装饰器内功:闭包变量捕获与运行时优化技术
许多教程演示装饰器用法,但很少解释闭包变量在内存中的捕获时机和生命周期。本教程通过反汇编比较不同写法下的字节码,揭示函数定义时自由变量的绑定过程。你将实现一个带超时控制的缓存装饰器,并理解如何使用 __wrapped__ 和 functools.wraps 保持元数据。最后,学习通过装饰器工厂提前计算部分结果来优化运行时性能。
import functools
import time
def timed_cache(ttl_seconds):
def decorator(func):
cache = {}
@functools.wraps(func)
def wrapper(*args):
now = time.time()
if args in cache:
value, timestamp = cache[args]
if now - timestamp < ttl_seconds:
return value
result = func(*args)
cache[args] = (result, now)
return result
return wrapper
return decorator