from __future__ import with_statement from contextlib import contextmanager @contextmanager def gen(): print '__enter__' try: yield finally: print '__exit__' with gen(): raise StopIteration('body') print with gen(): raise GeneratorExit('body') ---------- Run ---------- __enter__ __exit__ __enter__ __exit__ Traceback (most recent call last): File "test25.py", line 53, in raise GeneratorExit('body') GeneratorExit: body