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
原理说明
- 装饰器
track_yield接收原__iter__方法,返回一个包装后的方法 - 包装方法先获取当前实例的类名,再遍历原生成器的产出值
- 每产出一个值后,立即执行自定义打印逻辑
- 通过动态替换类的
__iter__方法,所有该类的实例都会自动应用这个监控逻辑,完全不需要修改原类代码
内容的提问来源于stack exchange,提问作者Nicolás Tsu
相关产品推荐
相关产品推荐

