Decorator question
Peter Otten
__peter__ at web.de
Sat Oct 16 10:49:50 EDT 2010
Lucasm wrote:
> I have a decorator problem and hope someone is able to help me out/
> assist me. Thanks in advance.
>
> Suppose:
> ### Begin some_library_module ###
>
> def some_decorator(some_method):
> def inner(an_arg, *args, **kwargs):
> return some_method(an_arg, *args, **kwargs)
> return inner
>
> ### End some_library_module ###
>
> ### Begin my_module ###
>
> def my_decorator(some_method):
> def inner(self, an_arg, *args, **kwargs):
> self.do_something()
At this point some_method() is just a Python function. You have to build a
bound method or at least something that "knows" about self before you pass
it on:
bound_method = some_method.__get__(self)
# bound_method = new.instancemethod(some_method, self)
# bound_method = functools.partial(some_method, self)
return some_decorator(bound_method)(an_arg, *args, **kwargs)
> return inner
>
>
> class My_Class(object):
> @my_decorator
> def my_method(self, an_arg, *args, **kwargs):
> print self, an_arg
>
> def do_something(self):
> pass
>
> ### End My_module ###
>
>>>> My_Class().my_method('bla')
> TypeError: my_method() takes at least 2 arguments (1 given)
>
> `self` is lost in the process, because my decorator does use it and
> the library's doesn't. I fail to find a way to keep self in the args
> without modifying the library.
More information about the Python-list
mailing list