J'ai essayé de créer un décorateur qui peut être utilisé avec les fonctions et les méthodes en python. Ce n'est pas si difficile, mais lors de la création d'un décorateur qui prend des arguments, il semble que ce soit.Utiliser le même décorateur (avec des arguments) avec des fonctions et des méthodes
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)
Le code ci-dessus enveloppements correctement la fonction/méthode, mais dans le cas d'un procédé, l'argument request
est le cas, il fonctionne sur, et non pas le premier argument non-soi.
Existe-t-il un moyen de dire si le décorateur est appliqué à une fonction plutôt qu'à une méthode, et traiter en conséquence?
Vous devez ajouter 'update_wrapper (self, func)' au * début * de '_MethodDecoratorAdaptor .__ init__' (où update_wrapper est amusant module ctools). Cela permet aux décorateurs qui en résultent de conserver des attributs personnalisés sur les fonctions/callables qu'ils décorent, tout en les gardant également composables. – spookylukey
J'ai découvert que cette méthode ne fonctionne que dans certaines circonstances, et est extrêmement difficile à déboguer quand cela ne fonctionne pas. http://groups.google.com/group/django-developers/msg/f36976f5cfbcbeb3 – spookylukey
@spookylukey En fait, la manière dont cela est géré dans Django est également très propre. – astrojuanlu