
On 2011-10-19 04:14, Nikolaus Rath wrote:
I would much rather have something like this:
def my_fun(): allocate_res1() atreturn.register(cleanup_res1) # do stuff allocate_res2() atreturn.register(cleanup_res2) # do stuff allocate_res3() atreturn.register(cleanup_res3) # do stuff return
Has the idea of implementing such "on return" handlers ever come up? Maybe there is some tricky way to do this with function decorators?
How about a not-so-tricky solution using context managers? Something like (untested):
import contextlib
@contextlib.contextmanager def atwithexit(): handlers = [] try: yield handlers.append finally: for h in reversed(handlers): h()
def my_fun(): with atwithexit() as atreturn: allocate_res1() atreturn(cleanup_res1) # do stuff allocate_res2() atreturn(cleanup_res2) # do stuff allocate_res3() atreturn(cleanup_res3) # do stuff return
HTH
- Jacob