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

Outils pour utilisateurs

Outils du site


decorateurs_verifargs

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
Prochaine révision Les deux révisions suivantes
decorateurs_verifargs [2011/03/28 06:55]
tyrtamos
decorateurs_verifargs [2011/03/28 07:11]
tyrtamos
Ligne 3: Ligne 3:
 ===== Problématique ===== ===== Problématique =====
  
-Si on prend l'exemple d'une calculatrice, toutes les fonctions de calcul peuvent être appelées avec des données saisie par l'utilisateur. Il est alors important qu'en cas d'erreur à cause de données anormales (ex: racine carrée d'un nombre négatif), il puisse recevoir un message explicite sur l'erreur qu'il a commise afin qu'il puisse la corriger.+Si on prend l'exemple d'une calculatrice, toutes les fonctions de calcul peuvent être appelées avec des données saisie par l'utilisateur. Il est alors important qu'en cas d'erreur à cause de données anormales (ex: racine carrée d'un nombre négatif)
 + 
 +  * on puisse récupérer l'erreur pour qu'elle ne "plante" pas la calculatrice, 
 + 
 +  * on puisse renvoyer à l'utilisateur un message explicite sur l'erreur qu'il a commise afin qu'il puisse la corriger.
  
 C'est le cas pour la vérification de conditions sur les arguments (ex: n>0) et sur leurs types (ex: type(n)=int). Le problème est que ces vérifications doivent être codées dans chacune des fonctions, ce qui prend du temps et de la place. D'autant que l'on n'a pas toujours accès au code des fonctions (ex: compilées en C), ce qui oblige à créer des fonctions enveloppes. C'est le cas pour la vérification de conditions sur les arguments (ex: n>0) et sur leurs types (ex: type(n)=int). Le problème est que ces vérifications doivent être codées dans chacune des fonctions, ce qui prend du temps et de la place. D'autant que l'on n'a pas toujours accès au code des fonctions (ex: compilées en C), ce qui oblige à créer des fonctions enveloppes.
  
-L'objectif de cette page est de permettre ces vérifications des arguments passées aux fonctions et méthodes en utilisant les **décorateurs**.  +L'objectif de cette page est de permettre ces vérifications des arguments passés aux fonctions et méthodes en utilisant les **décorateurs**.  
  
 Les décorateurs sont des fonctions ou des classes qui permettent de modifier des fonctions ou des méthodes par des opérations faites avant et/ou après leur appel. Les décorateurs sont des fonctions ou des classes qui permettent de modifier des fonctions ou des méthodes par des opérations faites avant et/ou après leur appel.
Ligne 13: Ligne 17:
 Voir la documentation Python, et, par exemple: [[http://wiki.python.org/moin/PythonDecoratorLibrary]] Voir la documentation Python, et, par exemple: [[http://wiki.python.org/moin/PythonDecoratorLibrary]]
  
-===== Utilisation =====+===== Décorateur proposé =====
  
-On définit un décorateur qui s'appelle ici verifargs(). Ce décorateur peut recevoir des arguments qui sont de 2 types:+On définit un décorateur qui s'appelle ici **verifargs()**. Ce décorateur peut recevoir des arguments qui sont de 2 types:
  
   * pour les arguments par position: des chaines de caractères représentant des expressions booléennes qui doivent être vraies (ex: "n>0")   * pour les arguments par position: des chaines de caractères représentant des expressions booléennes qui doivent être vraies (ex: "n>0")
Ligne 31: Ligne 35:
 On voit bien ici les 2 types de vérification à faire: les conditions ("a>=b", "c>=0") et les vérifications de type (b=int, c=(int,long,float), d=(NoneType,str,unicode)) On voit bien ici les 2 types de vérification à faire: les conditions ("a>=b", "c>=0") et les vérifications de type (b=int, c=(int,long,float), d=(NoneType,str,unicode))
  
-On voit aussi qu'on n'est pas obligé de tout vérifier: ici, le type de la variable a n'est pas vérifié+On voit aussi qu'on n'est pas obligé de tout vérifier: ici, le type des variables et c n'est pas vérifié 
 + 
 +Quelques exemples d'appel de cette fonction:
  
 <code python> <code python>
-fonctiontest(6, 5, 3.123, d=None) +r = fonctiontest(6, 5, 3.123, d=None) 
-# appel réussi: toutes les conditions et types sont ok+# appel réussi: toutes les conditions et tous les types sont ok 
 +# à noter que le type de la valeur None est vérifié grâce à NoneType du module standard types 
  
-fonctiontest(2, "truc", 3, d="toto")+r = fonctiontest(2, "truc", 3, d="toto")
 # échec: mauvais type pour b # échec: mauvais type pour b
 # à noter que la vérification sur les types est faite avant l'évaluation des conditions   # à noter que la vérification sur les types est faite avant l'évaluation des conditions  
  
-fonctiontest(2, 5, 3, d=12.56)+r = fonctiontest(2, 5, 3, d=12.56)
 # échec: condition a>=b non remplie # échec: condition a>=b non remplie
 # à noter que les types des arguments par défaut non passés (ici e=123) ne sont pas testés # à noter que les types des arguments par défaut non passés (ici e=123) ne sont pas testés
  
-fonctiontest(6, 5, -3.123, d=None) +r = fonctiontest(6, 5, -3.123, d=None) 
-# échec: condition c>=0 non remplie +# échec: condition c>=0 non remplie
 </code> </code>
  
-Ça marche aussi pour les méthodes des classes:+Ça marche aussi de la même façon pour les méthodes des classes:
  
 <code python> <code python>
Ligne 60: Ligne 67:
 x = Classetest() x = Classetest()
  
-x.methodetest(2, 5, 3.123, d=None)+r = x.methodetest(2, 5, 3.123, d=None)
 # échec: condition a>=b non remplie # échec: condition a>=b non remplie
 </code> </code>
Ligne 68: Ligne 75:
 <code python> <code python>
 try: try:
-    x.methodetest(5, 5, 3.123, d=None)+    r = x.methodetest(5, 5, 3.123, d=None)
 except (ValueError, TypeError) as e: except (ValueError, TypeError) as e:
     print e     print e
Ligne 78: Ligne 85:
  
 <code python> <code python>
 +#! /usr/bin/python
 +# -*- coding: utf-8 -*-
 +# Python v2.7
 +
 from types import NoneType  # pour tester le type de la valeur 'None' from types import NoneType  # pour tester le type de la valeur 'None'
  
decorateurs_verifargs.txt · Dernière modification: 2011/04/04 21:19 de tyrtamos