[Python-ideas] Avoiding nested for try..finally: atexit for functions?
Nikolaus Rath
Nikolaus at rath.org
Wed Oct 19 15:54:24 CEST 2011
Andrew Bennetts <andrew-CCXH/aKPDeEYtQj7fl1lsA at public.gmane.org> writes:
> On Tue, Oct 18, 2011 at 10:14:56PM -0400, 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?
>
> The "with" statement is a good answer. If for some reason you need to
> be compatible with version of Python so old it doesn't have it, then try
> the bzrlib.cleanup module in bzr. It implements the sort of API you
> describe above.
Yes, that's sort of what I was thinking about. I think the API is still
more convoluted than necessary, but that's probably because it works
with Python 2.4.
Having thought about this a bit more, I think it should be possible to
use 'with' rather than decorators to implement something like this:
with CleanupManager() as mngr:
allocate_res1()
mngr.register(cleanup_res1)
# do stuff
allocate_res2()
mngr.register(cleanup_res2)
# do stuff
allocate_res3()
mngr.register(cleanup_res3)
# do stuff
The mngr object would just run all the registered functions when the
block is exited.
Thoughts?
Best,
-Nikolaus
--
»Time flies like an arrow, fruit flies like a Banana.«
PGP fingerprint: 5B93 61F8 4EA2 E279 ABF6 02CF A9AD B7F8 AE4E 425C
More information about the Python-ideas
mailing list