Bonjour,
Jusqu'à présent, j'ai toujours soigneusement évité de toucher aux décorateurs. Je me méfiais de ces choses étranges, et je m'en passais facilement. Jusqu'au jour ou j'ai commencé à entrevoir des applications intéressantes.
Je vous propose ici un décorateur pour vérifier les arguments d'appel d'une fonction ou d'une méthode. Les vérifications peuvent porter sur des conditions (ex: n>0) et sur les types (ex: n=int). Le tuto est ici: http://python.jpvweb.com/mesrecettes...eurs_verifargs. Vous pouvez essayer le décorateur avec un simple copier-coller.
J'ai pensé à ce décorateur pour une calculatrice: chacune des fonctions de calcul peut être appelée avec les arguments saisis par l'utilisateur. Il est donc important de tester ces arguments, non seulement pour empêcher le plantage de cette calculatrice, mais aussi pour renvoyer à l'utilisateur un message d'erreur explicite afin qu'il puisse corriger. Donc, actuellement, TOUTES ces fonctions de calcul commencent par un code de vérification qui prend souvent plus de place que le code de calcul lui-même. On voit tout de suite l'intérêt du décorateur: cette vérification ne prendra désormais qu'une seule ligne écrite avant chaque fonction!
Exemple d'utilisation sur une fonction "fonctiontest":
On voit bien à quel point ça simplifie le code: une fois le décorateur écrit, toutes les fonctions et méthodes d'un programme peuvent l'utiliser. Ce sont les arguments passés au décorateur qui définissent les vérifications à faire pour chaque fonction ou méthode.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 @verifargs("a>=b", "c>=0", b=int, c=(int,long,float), d=(NoneType,str,unicode)) def fonctiontest(a, b, c, d="toto", e=123): return a*b*c*e, d
Exemples d'appel de cette fonction:
On peut, bien entendu, récupérer proprement les exceptions générées:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 r = fonctiontest(6, 5, 3.123, d=None) # 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 r = fonctiontest(2, "truc", 3, d="toto") # échec: mauvais type pour b # à noter que la vérification sur les types est faite avant l'évaluation des conditions r = fonctiontest(2, 5, 3, d="machin") # é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 r = fonctiontest(6, 5, -3.123, d=None) # échec: condition c>=0 non remplie
J'ai essayé de penser à tout, mais je ne suis pas sûr d'avoir réussi: les personnes intéressées peuvent-elles me donner leur avis?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 try: r = fonctiontest(5, 5, -3.123, d=None) except (ValueError, TypeError) as e: print e
Merci d'avance!
Tyrtamos
Partager