I have been trying to create a decorator that can be used with both functions and methods in python. This on it’s own is not that hard, but when creating a decorator that takes arguments, it seems to be.
class methods(object):
def __init__(self, *_methods):
self.methods = _methods
def __call__(self, func):
def inner(request, *args, **kwargs):
print request
return func(request, *args, **kwargs)
return inner
def __get__(self, obj, type=None):
if obj is None:
return self
new_func = self.func.__get__(obj, type)
return self.__class__(new_func)
The above code wraps the function/method correctly, but in the case of a method, the request argument is the instance it is operating on, not the first non-self argument.
Is there a way to tell if the decorator is being applied to a function instead of a method, and deal accordingly?
To expand on the
__get__approach. This can be generalized into a decorator decorator.In this way you can just make your decorator automatically adapt to the conditions it is used in.
Notice that the wrapper function is called on all function calls, so don’t do anything expensive there.
Usage of the decorator: