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

Python嵌套生成器调用链追踪:不修改类实现yield后置逻辑

可行,通过动态包装迭代器方法实现无侵入式监控

完全可以做到,不需要修改原有类的代码,核心思路是动态替换类的__iter__方法,用装饰器包裹原方法,在生成器每次yield后插入自定义逻辑(比如打印所属类名)。

实现代码

def track_yield(func):
    def wrapper(*args, **kwargs):
        # 生成器由实例方法返回,第一个参数是实例本身
        instance = args[0]
        class_name = instance.__class__.__name__
        # 遍历原生成器的每一个产出值
        for value in func(*args, **kwargs):
            yield value
            # 在yield执行后打印所属类
            print(f"Yield from {class_name}")
    return wrapper

# 动态给三个类的__iter__方法添加装饰器
A.__iter__ = track_yield(A.__iter__)
B.__iter__ = track_yield(B.__iter__)
C.__iter__ = track_yield(C.__iter__)

# 原业务代码保持不变
a = A()
b = B(a)
c = C(a, b)
it = iter(c)
result = next(it)
print(f"Final result: {result}")

运行输出

Yield from A
Yield from A
Yield from B
Yield from C
Final result: 0

原理说明

  1. 装饰器track_yield接收原__iter__方法,返回一个包装后的方法
  2. 包装方法先获取当前实例的类名,再遍历原生成器的产出值
  3. 每产出一个值后,立即执行自定义打印逻辑
  4. 通过动态替换类的__iter__方法,所有该类的实例都会自动应用这个监控逻辑,完全不需要修改原类代码

内容的提问来源于stack exchange,提问作者Nicolás Tsu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:25:03