[Python-ideas] Avoiding nested for try..finally: atexit for functions?

Nikolaus Rath Nikolaus at rath.org
Sun Oct 23 16:34:49 CEST 2011


On 10/21/2011 08:22 PM, Jan Kaliszewski wrote:
> An improved (and at the same time simplified) implementation (being also
> a recipe for Python 2.x, though this list is about ideas for Py3.x):
> 
>     class CleanupManager(object):
> 
>         def __init__(self, initial_callbacks=()):
>             self.cleanup_callbacks = list(initial_callbacks)
> 
>         def register(self, callback, *args, **kwargs):
>             self.cleanup_callbacks.append((callback, args, kwargs))
> 
>         def __enter__(self):
>             return self
> 
>         def __exit__(self, exc_type, exc, tb):
>             self._next_callback()
> 
>         def _next_callback(self):
>             if self.cleanup_callbacks:
>                 callback, args, kwargs = self.cleanup_callbacks.pop()
>                 try:
>                     callback(*args, **kwargs)
>                 finally:
>                     # all cleanup callbacks to be used
>                     # Py3.x: all errors to be reported
>                     self._next_callback()
> 
> I hope it implements well what you explained... I'm not sure if it is
> worth to be added to the standard library (in the case of your primary
> example I'd rather prefer that try-finally nested structure) -- though
> in some cases it may become really useful:


It implements almost exactly what I need. I will use it in a slightly
modified form so that exceptions in the cleanup handlers are logged and
discarded, so that they original exception is preserved (can't switch to
Python 3 before pycryptopp becomes Py3 compatible).


Who decides if it's going into stdlib? I'm of course in favor, but I
feel that my opinion may not count that much and, in addition to that,
be highly biased :-).

Thanks,

   -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