2012-05-05 5 views
1

Je ne suis pas le meilleur avec les décorateurs et j'essaye d'en construire un pour une tâche (évidemment). Fondamentalement, j'ai ma fonction que je veux décorer (c'est une application Django, mais il ne devrait pas importer)Décorateur qui retourne une fonction et accepte un paramètre

def foo(request, param): 
    # do something w/ param 

Maintenant je dois construire un décorateur pour prendre un paramètre:

@mydecorator('VALUE') 
def foo(request, param) 
    pass 

Alors au fond, je besoin de mon décorateur de prendre de la valeur foo, faire un peu de travail à la demande, puis revenez

Voici ce que j'ai jusqu'à présent, mais il ne fonctionne pas :(

def mydecorator(val): 
    @wraps(function) 
    def decorator(request, *args, **kwargs): 
     # do something with request with respect to val 
     return function(request, *args, **kwargs) 
    return decorator 

Besoin d'aide, grâce

+0

le deuxième bloc de code est manque un ':' à la fin. Je ne peux pas éditer cela comme SO veut au moins 6 caractères non-espace dans une édition – Anthon

Répondre

2

En dehors de la deuxième exemple de définition pour foo manque un « : » à la fin, le principal problème est que mydecorator devrait retourner un décorateur car il est un appel de fonction.

Si mydecorator ne serait pas un argument de vous écrire:

@mydecorator 
    def foo(request, param) 
     pass 

et non

@mydecorator() 
    def foo(request, param) 
     pass 

étant donné que les connaissances que vous devriez commencer par:

from functools import wraps 

def mydecorator(val): 
    def myrealdecorator(function): 
     @wraps(function) 
     def decorator(request, *args, **kwargs): 
      # do something with request with respect to val 
      print 'I know about', val 
      return function(request, *args, **kwargs) 
     return decorator 
    return myrealdecorator 

@mydecorator('VALUE') 
def foo(request, param): 
    print 'inside foo' 

foo('arg1', 'arg2') 
Questions connexes