擅长:python、mysql、java
<h2>假设</h2>
<p>当<code>break</code>语句离开循环时,将引发一个<code>GeneratorExit</code>异常,该异常通过生成器传播。<code>pdb</code>修改了它的传播方式,这正是我希望它引入的那种微妙的bug,使它不会耗尽<code>push_on_stream</code>正在<code>yield</code>的生成器。你知道吗</p>
<h2>试验</h2>
<p>如果我们将<code>push_on_stream</code>从:</p>
<pre><code>def push_on_stream(obj, stream):
yield obj
yield from stream
</code></pre>
<p>收件人:</p>
<pre><code>def push_on_stream(obj, stream):
yield obj
stream = iter(stream)
while True:
yield next(stream)
</code></pre>
<p>那么,这将对它产生足够的影响,以保证在这两种情况下的正确行为。你知道吗</p>
<h2>结果</h2>
<p>修正了错误!你知道吗</p>
<h2>解释</h2>
<p>由<a href="https://stackoverflow.com/a/53785152/5223757">user2357112's answer</a>提供。<em>基本上</em>,<code>yield from</code>没有按您认为的方式工作;当生成器由于<code>break</code>语句退出时,<code>yield from</code>会导致您正在迭代的生成器将自己标记为已耗尽。(<code>pdb</code>中断了这个过程,因为这是一个有点麻烦的问题。)这会导致解析器在第一个<code>)</code>终止,因为当第一个<code>break</code>语句运行时,底层迭代器会停止。你知道吗</p>