如何用Python装饰器记录循环内指定变量的每次重赋值?
解决方案
我们可以通过**三层装饰器+系统追踪(sys.settrace)**实现需求,无需修改原函数代码,精准追踪指定变量的每次赋值:
完整代码实现
import sys def outest_record_loop_func(target_var): def record_loop_func(func): def wrapper(*args, **kwargs): # 存储目标变量的赋值记录 value_records = [] def trace_func(frame, event, arg): # 仅追踪代码行执行时的变量变化 if event == 'line': if target_var in frame.f_locals: current_val = frame.f_locals[target_var] # 避免重复添加同一值(比如变量首次定义与后续赋值的重复场景) if not value_records or current_val != value_records[-1]: value_records.append(current_val) return trace_func # 保存原有追踪函数,执行完后恢复 original_trace = sys.gettrace() sys.settrace(trace_func) try: # 正常执行原函数,保留其输出逻辑 func(*args, **kwargs) finally: sys.settrace(original_trace) # 返回收集到的变量赋值记录 return value_records return wrapper return record_loop_func
使用示例
给原函数添加装饰器,指定要追踪的变量value:
@outest_record_loop_func(target_var='value') def first_5_mult_table(mult): for i in range(1,6): value = i*mult print(value) # 调用测试 result = first_5_mult_table(5) print("记录的列表:", result)
运行效果
执行后会依次输出5、10、15、20、25,同时返回列表[5,10,15,20,25]。
核心逻辑说明
- 三层装饰器的外层负责接收目标变量名,中间层绑定被装饰函数,内层实现追踪与记录逻辑
- 借助
sys.settrace监听函数执行过程中的局部变量变化,精准捕获目标变量的每次赋值 - 执行完原函数后恢复系统原有追踪函数,避免影响其他代码运行
- 自动过滤重复值,确保记录的是每次赋值的新值
内容的提问来源于stack exchange,提问作者Wallika
相关产品推荐
相关产品推荐

