You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:25:32