Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
decorateurs_modeles [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


decorateurs_modeles

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Dernière révision Les deux révisions suivantes
decorateurs_modeles [2012/03/26 08:24]
tyrtamos
decorateurs_modeles [2012/03/26 18:04]
tyrtamos
Ligne 249: Ligne 249:
         print u"Temps moyen: %.7f" % (self.tt/self.c)         print u"Temps moyen: %.7f" % (self.tt/self.c)
         return result         return result
 +
 +    def resultat(self):
 +        """retourne le résultat: compteur d'appel et temps moyen d'exécution"""        
 +        if self.c == 0: 
 +            tm = 0
 +        else: 
 +            tm = self.tt/self.c
 +        return c, tm
 +
  
 @tempsexecmoyen @tempsexecmoyen
Ligne 275: Ligne 284:
 #Temps moyen: 0.0003946 #Temps moyen: 0.0003946
 #4536 #4536
 +</code>
 +
 +J'ai ajouté la méthode 'resultat' au décorateur. On peut l'appeler à tout moment __séparément__ de son effet sur l'exécution de la fonction décorée. Et on l'appelle par l'intermédiaire de la fonction décorée! cela donnera le nombre total d'appels ainsi que la moyenne des temps d'exécution cumulés sur tous les appels:
 +
 +<code python>
 +print calcul.resultat()
 </code> </code>
  
Ligne 292: Ligne 307:
 ==== Décorateurs avec arguments ==== ==== Décorateurs avec arguments ====
  
-Même chose que le décorateur précédent, à part qu'on peut passer des arguments au décorateur pour déterminer son comportement devant chaque fonction décorée:+Même chose que le décorateur précédent, à part qu'on peut passer des arguments au décorateur pour déterminer son comportement devant chaque fonction décorée
 + 
 +Par rapport aux code habituellement présenté comme modèle, j'ajoute une variable de classe adr qui est un dictionnaire qui va stocker les adresses des instances. Sans cette solution (je n'en ai pas trouvé d'autres), on ne peut pas comme précédemment accéder à une méthode supplémentaire du décorateur comme 'resultat'.
  
 <code python> <code python>
 class decorateur(object): class decorateur(object):
     """ decorateur avec passage d'arguments """     """ decorateur avec passage d'arguments """
 +    
 +    adr = {}
 +    
     def __init__(self, *decargs, **deckwargs):     def __init__(self, *decargs, **deckwargs):
         self.decargs = decargs # arguments par position passés au décorateur         self.decargs = decargs # arguments par position passés au décorateur
         self.deckwargs = deckwargs # arguments par défaut passés au décorateur         self.deckwargs = deckwargs # arguments par défaut passés au décorateur
 +    
     def __call__(self, fonc):      def __call__(self, fonc): 
         @functools.wraps(fonc)         @functools.wraps(fonc)
Ligne 308: Ligne 329:
             # instructions après             # instructions après
             return result             return result
 +        self.__class__.adr[fonc.__name__] = self
         return appelfonc         return appelfonc
 +
 +    def resultat(self):
 +        pass
 </code> </code>
  
decorateurs_modeles.txt · Dernière modification: 2012/03/26 18:08 de tyrtamos