Greg Ewing wrote:
Jacob Holm wrote:
Of course. Here is a demonstration/test...
However, when I run this using your patch, the first 3 "Close" messages, and the 3 "GeneratorExit" messages are missing.
I don't understand why you expect to get the output you present. Can you explain your reasoning with reference to the relevant sections of the relevant PEPs that you mention?
Starting with "Close". The only reason I excpect *any* "Close" message is that the expansion in your PEP explicitly calls close in the finally clause. It makes no distinction between different ways of exiting the block, so I'd expect one call for each time it is exited. 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") When the generator is closed (due to the del g lines in the example), this says to throw a GeneratorExit and handle the result. If we do this manually, the throw will be delegated to the iterator, which will print the "Throw: (<type 'exceptions.GeneratorExit'>,)" message. Do I make sense yet? - Jacob