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