Guido van Rossum added the comment:

It was a bit more subtle. I think like this:

def f():
    with some_lock:
        yield 0
        yield 1

def g():
    with another_lock:
        it = f()
        for i in it:
            raise

We determined that another_lock was freed *before* some_lock.  This is because 
the local variable 'it' keeps the generator object returned by f() alive until 
after the with-block in g() has released another_lock.

I think this does not strictly require f to be a generator -- it's any kind of 
closable resource that only gets closed by its destructor.

The solution is to add a try/finally that calls it.close() before leaving the 
with-block in g().

Hope this helps.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue25994>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to