[Python-Dev] context manager - generator interaction?
bob.sidebotham at gmail.com
Thu Apr 5 21:54:22 CEST 2007
The interaction shown below feels like a bug, or at least very much a
trap for the unwary. It's some sort of interaction between a context
manager and a generator, both of which can raise StopIteration. The
code is excised from a real application, so it's a bit artificial
looking. Nevertheless, it represents an entirely natural evolution of
some code (whereby the call to a context manager was added deep within
the code). Since it seems to work with open as the context manager,
but not with my own null context manager defined with
context_manager(), it feels like this is probably a bug in
I did look in the archives, and it's possible this has been raised
before, but I wasn't clear on that. So apologies in advance if this is
This is using the stock distribution of python 2.5 on Linux 2.4.
bash-2.05b$ cat test.py
from __future__ import with_statement
return# Should cause stop iteration
yield # Just to make this a generator, for this example
# This works as expected.
gen().next() # Should immediately raise StopIteration
print "Part 1: should reach here!"
print "Part 1: shouldn't reach here!"
# Now try the same thing, but with a context manager wrapping the
# This also works as expected.
with open("/etc/passwd") as pw:
print "Part 2: should reach here!"
print "Part 2: shouldn't reach here!"
# Finally, try this with our own home grown null context manager.
# This does not work as expected.
from contextlib import contextmanager
print "Part 3: should reach here!"
print "Part 3: shouldn't reach here!"
bash-2.05b$ python test.py
Part 1: should reach here!
Part 2: should reach here!
Part 3: shouldn't reach here!
More information about the Python-Dev