homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author scoder
Recipients scoder
Date 2012年03月07日.11:09:01
SpamBayes Score 4.7559343e-08
Marked as misclassified No
Message-id <1331118543.05.0.972821091665.issue14220@psf.upfronthosting.co.za>
In-reply-to
Content
Based on the existing "test_attempted_yield_from_loop" in Lib/test/test_pep380.py, I wrote this test and I wonder why it does not work:
"""
def test_attempted_reentry():
 """
 >>> for line in test_attempted_reentry(): print(line)
 g1: starting
 Yielded: y1
 g1: about to yield from g2
 g2: starting
 Yielded: y2
 g2: about to yield from g1
 g2: caught ValueError
 Yielded: y3
 g1: after delegating to g2
 Yielded: y4
 """
 trace = []
 def g1():
 trace.append("g1: starting")
 yield "y1"
 trace.append("g1: about to yield from g2")
 yield from g2()
 trace.append("g1: after delegating to g2")
 yield "y4"
 def g2():
 trace.append("g2: starting")
 yield "y2"
 trace.append("g2: about to yield from g1")
 try:
 yield from gi
 except ValueError:
 trace.append("g2: caught ValueError")
 else:
 trace.append("g1 did not raise ValueError on reentry")
 yield "y3"
 gi = g1()
 for y in gi:
 trace.append("Yielded: %s" % (y,))
 return trace
"""
In current CPython, I get this:
"""
Failed example:
 for line in test_attempted_reentry(): print(line)
Expected:
 g1: starting
 Yielded: y1
 g1: about to yield from g2
 g2: starting
 Yielded: y2
 g2: about to yield from g1
 g2: caught ValueError
 Yielded: y3
 g1: after delegating to g2
 Yielded: y4
Got:
 g1: starting
 Yielded: y1
 g1: about to yield from g2
 g2: starting
 Yielded: y2
 g2: about to yield from g1
 g2: caught ValueError
 Yielded: y3
"""
Even though I catch the ValueError (raised on generator reentry) at the position where I run the "yield from", the outer generator (g1) does not continue to run after the termination of g2. It shouldn't normally have an impact on the running g1 that someone attempts to jump back into it, but it clearly does here.
I noticed this while trying to adapt the implementation for Cython, because the original test was one of the few failing cases and it made the code jump through the generator support code quite wildly.
History
Date User Action Args
2012年03月07日 11:09:03scodersetrecipients: + scoder
2012年03月07日 11:09:03scodersetmessageid: <1331118543.05.0.972821091665.issue14220@psf.upfronthosting.co.za>
2012年03月07日 11:09:02scoderlinkissue14220 messages
2012年03月07日 11:09:01scodercreate

AltStyle によって変換されたページ (->オリジナル) /