Est-il possible de remplacer une fonction/méthode de décorateur au moment de l'exécution? [ python ]
Si j'ai une fonction :
@aDecorator
def myfunc1():
# do something here
if __name__ = "__main__":
# this will call the function and will use the decorator @aDecorator
myfunc1()
# now I want the @aDecorator to be replaced with the decorator @otherDecorator
# so that when this code executes, the function no longer goes through
# @aDecorator, but instead through @otherDecorator. How can I do this?
myfunc1()
Est-il possible de remplacer un décorateur au moment de l'exécution?
Vous devez vous connecter pour publier un commentaire.
Je ne sais pas si il existe un moyen de "remplacer" un décorateur, une fois qu'il a été appliqué, mais je pense que, probablement, il n'y a pas, parce que la fonction a déjà été changé.
Vous pouvez, de toute façon, appliquer un décorateur au moment de l'exécution basée sur une condition:
Comme Miya mentionné précédemment, vous pouvez remplacer le décorateur avec une autre fonction tout moment avant que l'interprète arrive à cette déclaration de la fonction. Cependant, une fois que le décorateur est appliquée à la fonction, je ne pense pas qu'il y est un moyen de remplacer dynamiquement le décorateur avec une autre. Ainsi, par exemple:
Ne fonctionne pas, parce que myfunc1 n'est plus la fonction que vous avez défini à l'origine; il a déjà été enveloppé. La meilleure solution ici est d'appliquer manuellement les décorateurs, oldskool de style, j'.e:
Edit: Ou, pour être un peu plus clair,
Voici un formidable recette pour vous aider à démarrer. Fondamentalement, l'idée est de passer une instance de classe dans le décorateur. Vous pouvez ensuite définir des attributs de l'instance de classe (faire un Borg si vous le souhaitez) et l'utiliser pour contrôler le comportement du décorateur lui-même.
Voici un exemple:
Naturellement, vous pouvez aussi intégrer le "décorateur décorateur" pour préserver les signatures, etc.
Sûr - vous pouvez obtenir la fonction de l'objet et de faire ce que vous voulez avec elle:
def aDecorator(f): return lambda *args, **kwargs: "HAHAHAHAHAHAHA"
. En général, ce n'est pas à proximité d'une approche valable. Si vous ne arrive d'avoir le contrôle de la première décorateur, alors il y a de plus propre, plus idiomatique de façons de le faire.Si vous voulez explicitement changer le décorateur, vous pourriez aussi bien choisir une plus explicite approche au lieu de créer décoré de la fonction:
deco1() et deco2() s'appliquent à la fonctionnalité des décorateurs de fournir et d'appel myfunc1() avec les arguments.
Je sais que c'est un vieux thread, mais j'ai eu beaucoup de plaisir à faire ce
Si le décorateur est une fonction, il suffit de remplacer it.