yield in try/finally case
Peter Otten
__peter__ at web.de
Thu Mar 3 11:20:02 EST 2016
Random832 wrote:
> On Thu, Mar 3, 2016, at 08:47, Peter Otten wrote:
>> This is because the last generator uf = upperfile(...) is not garbage-
>> collected and wasn't explicitly closed either.
>
> But the program hasn't ended yet when you run your assertion.
If your expectations are in line with Python's actual behaviour -- then
fine. Normally someone who writes
with acquire_resource() as r:
use(r)
assert r was released
wants the resource to be released when the with suite is left.
When the with-statement is moved into a generator
def gen_resource():
with acquire_resource() as r:
yield r
for r in gen_resource():
use(r)
break # use(r) triggering an exception would have the same effect
assert r was released # may fail
you are at the mercy of the Python interpreter's garbage collection
strategy.
Of course you are exiting the for-suite, not the with-suite. Nevertheless
this surprised me when Oscar pointed it out the first time.
More information about the Python-list
mailing list