Greg Ewing wrote:
Jacob Holm wrote:
The "GeneratorExit", I expect due to the description of close in PEP 342:
def close(self): try: self.throw(GeneratorExit) except (GeneratorExit, StopIteration): pass else: raise RuntimeError("generator ignored GeneratorExit")
Hmmm... well, my PEP kind of supersedes that when a yield-from is in effect, because it specifies that the subiterator is finalized first by attempting to call its 'close' method, not by throwing GeneratorExit into it. After that, GeneratorExit is used to finalize the delegating generator.
The reasoning is that GeneratorExit is an implementation detail of generators, not something iterators in general should be expected to deal with.
As already mentioned in another mail to this list (maybe you missed it?), the expansion in your PEP actually has the behaviour you expect for the GeneratorExit example because GeneratorExit doesn't inherit from Exception. No need to redefine anything here. Your patch is right, I was wrong, end of story... The other mismatch, concerning the missing "close" calls to the iterator, I still believe to be an issue. It is debatable whether the issue is mostly with the PEP or the implementation, but they don't match up as it is... - Jacob