【问题标题】:Stepping over a yield statement跳过一个 yield 语句
【发布时间】:2011-02-22 23:30:12
【问题描述】:

在 Python 调试器 (pdb) 中,我想跳过一个 yield 语句,但是点击 (n) for next 会将我带到 yield 的 destination,即生成器的使用者。我想转到生成器中执行的下一行。有没有办法做到这一点?

我使用的是 Python 2.6

【问题讨论】:

  • 这听起来确实像是下一步应该做的事情。 (从生成器的角度来看,yield 是一个函数调用,应该被next 跳过。)这听起来像是一个调试器错误;您可能想查看是否已通过 bugs.python.org 报告。
  • 虽然我可以理解为什么这里要求的行为可能是可取的,但我可以看到一个同样好的论点,即在调试器中执行一个步骤不应冒跳出调试循环的风险并无限期地运行。 (例如,如果生成器不再被调用)。对我来说,这听起来像是一个断点的工作。 (或新的调试器命令。)

标签: python generator pdb


【解决方案1】:

如果您的调试器允许您在此处使用断点并更改变量值,那么就像 [在伪代码中] 一样简单

Set Boolean yieldValue to true;
[breakpoint after that line is executed, you can set yieldValue to false here]
if yieldValue, yield value;

in other words:

bool yieldValue = true;
[breakpoint here]
if(yieldValue) yield value;

请注意,您通常不能在空行上放置断点。不过,你必须把它放在 if 语句之前。

【讨论】:

    【解决方案2】:

    在调试器中,在这种情况下,通常您希望将 (s) “步入”函数,而不是“下一步” (n)。

    "Next" 在你正在查看的范围内执行下一行; “step”将您带入下一个范围,在本例中为生成器,这听起来像是您想要做的。

    【讨论】:

    • 不,他是说在生成器中,他想跨过一个 yield 并落在它后面的行上,这正是“next”应该做的。 (“每 15 秒 1 条评论,计时器重置”?呃,谁认为这是个好主意,就该被枪毙……)
    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 2023-02-22
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多