If you can use the @contextlib.contextmanager decorator your life gets a lot easier:
import contextlib
@contextlib.contextmanager
def internal_cm():
try:
print "Entering internal_cm"
yield None
print "Exiting cleanly from internal_cm"
finally:
print "Finally internal_cm"
@contextlib.contextmanager
def external_cm():
with internal_cm() as c:
try:
print "In external_cm_f", c
yield [c]
print "Exiting cleanly from external_cm_f", c
finally:
print "Finally external_cm_f", c
if "__main__" == __name__:
with external_cm():
print "Location A"
print
with external_cm():
print "Location B"
raise Exception("Some exception occurs!!")