Greg Ewing wrote:
Jacob Holm wrote:
Can you explain in a little more detail how the inlining argument makes you want to not catch a StopIteration escaping from throw? [snip explanation] Thank you very much for the clear explanation. It seems each of us were missing something. AFAICT your latest expansion (reproduced below) fixes this.
I have a few (final, I hope) nits to pick about the finally clause. To start with there is no need for a separate "try". Just adding the finally clause to the next try..except..else has the exact same semantics. Then there is the contents of the finally clause. It is either too much or too little, depending on what it is you are trying to specify. If the intent is to show that the last reference from the expansion to _i disappears here, it fails because _m is likely to hold a reference as well. In any case I don't see a reason to single out _i for deletion. I suggest just dropping the finally clause altogether to make it clear that we are not promising any finalization beyond what is explicit in the rest of the code. - Jacob ------------------------------------------------------------------------ _i = iter(EXPR) try: try: _y = _i.next() except StopIteration, _e: _r = _e.value else: while 1: try: _s = yield _y except: _m = getattr(_i, 'throw', None) if _m is not None: _x = sys.exc_info() try: _y = _m(*_x) except StopIteration, _e: if _e is _x[1]: raise else: _r = _e.value break else: _m = getattr(_i, 'close', None) if _m is not None: _m() raise else: try: if _s is None: _y = _i.next() else: _y = _i.send(_s) except StopIteration, _e: _r = _e.value break finally: del _i RESULT = _r