functools.wraps behaviour

ISE Development isenntp at gmail.com
Tue Sep 16 03:24:19 EDT 2014


Chris Angelico wrote:

> On Tue, Sep 16, 2014 at 9:15 AM, ISE Development <isenntp at gmail.com>
> wrote:
>>         @functools.wraps(func)
>>         def wrapper(self):
>>             func(self)
>>         return wrapper
>>
>>     try:
>>         k.method(1)
>>     except Exception as e:
>>         print('exception:',e)
>>
>> The output (Python 3.3) is:
>>
>> Klass.method: <function Klass.method at 0x7f2d7c454b00>
>> k.method <bound method Klass.method of <__main__.Klass object at
>> 0x7f2d7c4570d0>>
>> exception: wrapper() takes 1 positional argument but 2 were given
>>
>> The first two lines are as expected, using the name of the decorated
>> function. However, the exception uses the name of the decorating wrapper
>> function.
> 
> In your wrapper, you're swallowing all arguments. That means you're
> consciously rejecting them, and passing none on. If you want a wrapper
> to let the wrapped function decide about arguments, try this:
> 
>     def decorator(func):
>         @functools.wraps(func)
>         def wrapper(self, *args, **kwargs):
>             func(self, args, kwargs)
>         return wrapper
> 
> With that change, the error message reports that it's method() that's
> rejecting the args.
> 
> So yes, I'd say this is a feature; you can either let the wrapped
> function make the decision, or you can have the wrapping function deal
> with args.
> 
> ChrisA

Very good point. Hadn't thought about it that way - it makes sense now.

Thanks.

-- isedev



More information about the Python-list mailing list