Chris Angelico wrote: > On Tue, Sep 16, 2014 at 9:15 AM, ISE Development <isen...@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 -- https://mail.python.org/mailman/listinfo/python-list