functools's partial and update_wrapper does not work together

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • piotr.findeisen@gmail.com

    #1

    functools's partial and update_wrapper does not work together

    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
    return wrapper

    def foo(i):
    raise ValueError(str( i) + " is too little")

    never_throw(par tial(foo, 3))

    However this fails with an exception saying
    AttributeError: 'functools.part ial' object has no attribute
    '__module__'.

    How can I use generic wrapper (never_throw) around partials?

    Thank you,
    Piotr
  • Bruno Desthuilliers

    #2
    Re: functools's partial and update_wrapper does not work together

    piotr.findeisen @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 KeyboardInterru pt are
    exceptions too.
    return wrapper
    >
    def foo(i):
    raise ValueError(str( i) + " is too little")
    >
    never_throw(par tial(foo, 3))
    >
    However this fails with an exception saying
    AttributeError: 'functools.part ial' 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,
    KeyboardInterru pt,
    OtherStuffYouDo ntWantToPassSil entyHere,
    )

    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

    Comment

    • piotr.findeisen@gmail.com

      #3
      Re: functools's partial and update_wrapper does not work together

      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).
      you're right. it's already there http://bugs.python.org/issue3445

      regards!

      Comment

      Working...