définissant les fonctions de décorateur
-
16-09-2019 - |
Question
Pourquoi cela ne fonctionne pas? Comment puis-je le faire fonctionner? Autrement dit, comment puis-je faire dans ma gu accessible fonction décorée?
def decorate(f):
def new_f():
def gu():
pass
f()
return new_f
@decorate
def fu():
gu()
fu()
Dois-je ajouter gu à un dictionnaire de fonctions définies en quelque sorte? Ou puis-je ajouter gu à l'espace de noms local de f avant de l'appeler?
La solution
En principe, vous pouvez créer une nouvelle fonction en utilisant le même code que l'ancien, mais en remplaçant la portée mondiale avec un texte législatif modifié:
import new
def with_bar(func):
def bar(x):
return x + 1
f_globals = func.func_globals.copy()
f_globals['bar'] = bar
return new.function(func.func_code, f_globals,
func.func_name, func.func_defaults, func.func_closure)
@with_bar
def foo(x):
return bar(x)
print foo(5) # prints 6
Dans la pratique, vous devriez vraiment trouver une meilleure façon de le faire. En passant dans les fonctions en tant que paramètres est une option. Il pourrait y avoir d'autres approches aussi, mais il est difficile de dire ce qui cadrerait sans description du problème de haut niveau.
Autres conseils
Si vous devez passer gu
vous fu
devez faire explicitement par les paramètres:
def decorate(f):
def new_f():
def gu():
pass
f(gu)
return new_f
@decorate
def fu(gu):
gu()
fu()
gu est local au new_f fonction, qui est locale au décorer fonction .
gu () est uniquement définie dans new_f (). À moins que vous le retourner ou l'ancrer new_f () ou quelque chose d'autre, il ne peut pas être référencé à partir de l'extérieur new_f ()
Je ne sais pas ce que vous êtes, mais ce système semble très complexe. Peut-être que vous pouvez trouver une solution moins compliquée.
Pourquoi ne pas faire votre décorateur une classe plutôt qu'une fonction? Il est apparemment possible, comme je l'ai découvert quand je regardais à travers l'aide pour la commande interne property
. (Auparavant, je pensais que vous pouvez appliquer simplement décorateurs aux classes, et non que les décorateurs eux-mêmes pourraient être des classes.)
(Bien sûr, gu
devrait être une méthode de la classe ou d'une classe interne.)