comment faire un conditionnel décorateur en python
Est-il possible de le décorateur une fonction conditionnelle. Par exemple, je veux décorer la fonction foo()
d'une fonction de minuterie (timeit
) seulement doing_performance_analysis est True
(voir le pseudo-code ci-dessous).
if doing_performance_analysis:
@timeit
def foo():
"""
do something, timeit function will return the time it takes
"""
time.sleep(2)
else:
def foo():
time.sleep(2)
Vous devez vous connecter pour publier un commentaire.
Décorateurs sont tout simplement callables que le retour d'un remplacement, éventuellement la même fonction, d'une cape, ou quelque chose de complètement différent. En tant que tel, vous pouvez créer un conditionnel décorateur:
Maintenant, vous pouvez l'utiliser comme ceci:
Le décorateur pourrait également être une classe:
Ici la
__call__
méthode joue le même rôle que le retour de l'decorator()
fonction imbriquée dans le premier exemple, et la fermeture de plus dedec
etcondition
paramètres sont stockés en tant qu'arguments sur l'instance jusqu'à ce que le décorateur est appliquée.method_decorator
. Comment faire de ce code compatible avec qui?@method_decorator(conditional_decorator(timeit, doing_performance_analysis))
.Un décorateur est simplement une fonction appliquée à une autre fonction. Vous pouvez l'appliquer manuellement:
Comment sur:
J'imagine que vous pouvez même l'envelopper dans un décorateur qui prendrait un indicateur booléen et un autre décorateur, et ne s'appliquerait qu'à la dernière si l'indicateur est fixé à
True
:Blckknght la réponse est idéal si vous voulez faire le vérifier à chaque fois que vous appelez la fonction, mais si vous avez un paramètre que vous pouvez lire en une fois et ne change jamais, vous ne voulez pas vérifier le réglage à chaque fois décoré de la fonction est appelée. Dans certains de nos hautes performances démons au travail, j'ai écrit un décorateur qui vérifie un fichier de réglages une fois lorsque le fichier python est chargée pour la première fois et décide si elle doit l'envelopper ou pas.
Voici un exemple de
En supposant que log_function_call les journaux de votre appel à une base de données, fichiers de log, ou quoi que ce soit et que config.get('RUN_TIMED_FUNCTIONS') vérifie votre configuration globale, puis en ajoutant le @chronométré décorateur à une fonction qui permet de vérifier une fois sur la charge pour voir si vous êtes timing sur ce serveur, de l'environnement, etc. et si non, alors il ne va pas changer l'exécution de la fonction sur la production ou l'autre des environnements où vous vous souciez de la performance.
Voici ce qui a fonctionné pour moi: