[Python-ideas] use context managers for new-style "for" statement

Bruce Frederiksen dangyogi at gmail.com
Sat Feb 21 15:36:05 CET 2009

Aahz wrote:
> On Fri, Feb 20, 2009, Raymond Hettinger wrote:
>> Bruce Frederikson:
>>>    for i in closing(gen(x)):
>>> if you want the generator closed automatically.
>> That doesn't really improve on what we have now:
>>    with closing(gen(x)) as g:
>>        for i in g:
>> The proposed syntax puts to much on one-line and unnecessarily
>> complicates another one of Python's fundamental tools.
> In addition to Bruce's other followup, saving a level of indention does
> have some utility.  That's not enough by itself, of course.

Yes, the *close* capability of generators can be exercised with an 
external "with closing" statement (except for itertools.chain, which has 
an inner generator which is inaccessible to the caller, but this 
proposal doesn't fix that problem either).

But the improvement comes when you want to exercise the *throw* 
capability of generators within a for statement.  Adding an optional 
__throw__ to context managers and honoring it in with statements doesn't 
let the generator convert the exception into a new yielded value to be 
tried ("oh, you didn't like the last value I yielded, try this one 
instead") which is one use of generator.throw.

And this solves both issues (close and throw) with the same mechanism, 
so it's conceptually simpler for the user than two separate solutions.

It also naturally extends the context manager capability to be able to 
encapsulate try/except patterns into re-usable context managers, in 
addition to encapsulating try/finally patterns.  Here, I'm referring to 
the standard use of context managers in with statements, irrespective of 
the for statement.

Oh, and, yes, it does allow the programmer to elide the use of the with 
statement in combination with the for statement.  In my practice, 90% of 
the with statements I use are this with/for pattern so I imagine that 
this would also be appreciated by the Python community.  But this is not 
the sole benefit, nor even the most important benefit.  So while I might 
agree with "That's not enough by itself", I wish to point out that this 
last benefit is not "by itself".

-bruce frederiksen

More information about the Python-ideas mailing list