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?

Était-ce utile?

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.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top