He estado tratando de crear un decorador que se pueda usar con funciones y métodos en python. Esto por sí solo no es tan difícil, pero cuando se crea un decorador que toma argumentos, parece serlo.Usando el mismo decorador (con argumentos) con funciones y métodos
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)
El código anterior envuelve la función/método correctamente, pero en el caso de un método, el argumento request
es la instancia que está operando en, no el primer argumento no autónomos.
¿Hay alguna manera de saber si el decorador se está aplicando a una función en lugar de a un método, y tratar en consecuencia?
Debería agregar 'update_wrapper (self, func)' al * comienzo * de '_MethodDecoratorAdaptor .__ init__' (donde update_wrapper es de diversión módulo ctools). Esto hace que los decoradores resultantes conserven atributos personalizados en las funciones/callables que decoran, a la vez que los mantiene también compostables. – spookylukey
Descubrí que este método solo funciona en algunas circunstancias y es extremadamente difícil depurarlo cuando no funciona. http://groups.google.com/group/django-developers/msg/f36976f5cfbcbeb3 – spookylukey
@spookylukey De hecho, la forma en que esto se maneja en Django es bastante limpia. – astrojuanlu