[Python-ideas] returning anonymous functions

Scott Dial scott+python-ideas at scottdial.com
Mon Dec 15 19:52:20 CET 2008


Mathias Panzenböck wrote:
> It is a very common case to return a nested function, e.g. in a decorator:
> 
> def deco(f):
>    def _f(*args,**kwargs):
>       do_something()
>       try:
>          return f(*args,**kwargs)
>       finally:
>          do_something_different()
>    return _f

Is is really that common? In this case, you are misrepresenting the
pattern. The appropriate version of this would require references to _f
to make it's signature match that of f's, and therefore this entire
argument is specious. In reality, the number of times you can get away
with returning a truly anonymous function (that isn't a glorified
lambda) is rare, I think.

def deco(f):
    def _f(*args,**kawrgs):
        ...
    functools.update_wrapper(_f, f)
    return _f

Or:

def deco(f):
    @functools.wraps(f)
    def _f(*args,**kawrgs):
        ...
    return _f

Even in the second case, it would be awkward to inline with the return
statement because of the need to invoke a decorator.

-Scott

-- 
Scott Dial
scott at scottdial.com
scodial at cs.indiana.edu



More information about the Python-ideas mailing list