VSCode调试Python含yield的函数时断点未触发的原因
问题原因及解决方法
核心原因:生成器函数的惰性执行特性
func1是生成器函数(带yield关键字),和普通函数func2的执行逻辑完全不同:
- 普通函数
func2:调用test2.func2()时会立即执行函数内部代码,所以断点能正常触发。 - 生成器函数
func1:调用test2.func1()时,并不会立即执行函数内部的循环代码,只是创建了一个生成器对象。只有当你迭代这个生成器对象(比如用for循环遍历、调用next()方法)时,函数才会开始执行,直到遇到yield暂停。
验证及修复示例
如果想让func1的断点触发,需要修改test1.py,对生成器进行迭代:
import test2 # 方式1:用for循环迭代生成器 for num in test2.func1(): pass # 方式2:调用next()手动触发(多次调用直到抛出StopIteration) gen = test2.func1() next(gen) next(gen) test2.func2()
修改后调试时,func1的断点就会正常触发。
内容的提问来源于stack exchange,提问作者Scorb
相关产品推荐
相关产品推荐

