[Python-ideas] "atexit" equivalent for functions in contextlib

Nikolaus Rath Nikolaus at rath.org
Thu Jan 29 06:49:00 CET 2015


Hello,

The other day, I was looking for an "atexit" equivalent at the function
level. I was hoping to replace code like this:

def my_function(bla, fasel):
    with ExitStack() as cm:
        ...
        cm.push(...)
        ...

with something like:

@handle_on_return
def my_function(bla, fasel, on_return):
    ...
    on_return.push(...)
    ...

It seems that contextlib *almost* offers a way to do this with ExitStack
and ContextDecorator - but as far as I can tell the final piece is
missing, because ContextDecorator does not offer a way to pass the
context manager to the decorated function. However, the following
decorator does the job:

 def handle_on_return(fn):
    @functools.wraps(fn)
    def wrapper(*a, **kw):
        with contextlib.ExitStack() as on_return:
            kw['on_return'] = on_return
            return fn(*a, **kw)
    return wrapper

It's not a lot of code, but my feeling is that not anyone who might be
interested in an "on_return" functionality would be able to come up with
this right away.

Would it make sense to add something along these lines to contextlib?
Maybe instead of a new decorator, ContextDecorator could also take an
additional keyword argument that tells it to pass the context manager to
the decorated function?

Best,
-Nikolaus
-- 
GPG encrypted emails preferred. Key id: 0xD113FCAC3C4E599F
Fingerprint: ED31 791B 2C5C 1613 AF38 8B8A D113 FCAC 3C4E 599F

             »Time flies like an arrow, fruit flies like a Banana.«


More information about the Python-ideas mailing list