functools's partial and update_wrapper does not work together

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Thu Aug 21 11:44:30 EDT 2008


piotr.findeisen at gmail.com a écrit :
> Hello!
> 
> I wanted to use a decorator to wrap partially applied function like
> this:
> from functools import *
> 
> def never_throw(f):
>     @wraps(f)
>     def wrapper(*args, **kwargs):
>         try: return f(*args, **kwargs)
>         except: pass

Not an answer to your question, but: by all means, *never* use bare 
except clauses. Please remember that SysExit and KeyboardInterrupt are 
exceptions too.

>     return wrapper
> 
> def foo(i):
>     raise ValueError(str(i) + " is too little")
> 
> never_throw(partial(foo, 3))
> 
> However this fails with an exception saying
> AttributeError: 'functools.partial' object has no attribute
> '__module__'.
> 
> How can I use generic wrapper (never_throw) around partials?

If not already done by someone else, it might be worth filling a ticket 
- generic decorators should work with any callable, not only with 
functions (well, IMHO at least).

A possible workaround is:

_dont_pass = (
     SysExit,
     KeyboardInterrupt,
     OtherStuffYouDontWantToPassSilentyHere,
)

def never_throw(f):
     """well... almost never..."
     try:
         f.__module__
     except AttributeError:
         f.__module__ = "whatever"
     @wraps(f)
     def wrapper(*args, **kwargs):
         try:
             return f(*args, **kwargs)
         except Exception, e:
             if isinstance(e, _dont_pass):
                 raise



HTH



More information about the Python-list mailing list