【问题标题】:pydev can't step in generatorspydev 无法进入生成器
【发布时间】:2025-12-25 16:15:07
【问题描述】:

我在 Windows 7 x64 上使用 pydev,我发现生成器函数中的断点被忽略(如果我注释掉 yield,一切正常)。

然后我发现了一个老问题Does Python debugger step in generators?

答案是“我刚刚测试了 eclipse,它会在安装了 pydev 的情况下进行调试。”

但是当我测试代码时,断点仍然被忽略。

def example(n):
    i = 1
    while i <= n:
        yield i
        i += 1

print "hello"

print "goodbye"

if __name__ == '__main__':
    example(8)

所以我的问题是:

  1. PyDev 是否​​能够介入生成器?
  2. 如果没有,我应该如何调试此类代码?

【问题讨论】:

  • @martineau 我刚刚从旧问题中复制了原始代码..

标签: python debugging generator pydev


【解决方案1】:

当我使用调试器准确运行旧问题的“使用生成器”部分中的代码(不是您的问题中的内容)并在 i += 1 语句上放置断点时,它确实停止在那里运行并且每次我按 F8 恢复时都会继续这样做,直到发电机用完为止。我正在为 Eclipse 2.8.2.2013090511 使用 PyDev。

问题是你的代码只调用了一次生成器函数,它只返回一个迭代器对象——它实际上并没有执行函数中的代码。为此,您需要以某种方式迭代返回的对象——通过for 语句隐式或通过调用其next 方法显式调用。请参阅文档Generators 部分中以“当您调用生成器函数时,它不返回单个值;...”开头的段落。

这是我使用的代码:

def example(n):
    i = 1
    while i <= n:
        yield i
        i += 1

print("hello")

for n in example(3):
    print(n)

print("goodbye")

【讨论】:

  • 非常感谢!我早该注意到的。
  • @laike9m:实际上,如果您不习惯 Python 的生成器和迭代器,这很容易忘记。如果您认为值得,请考虑对我的回答进行投票。