17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Structuration du code<br />

CHAPITRE 5<br />

La sous-fonction _only_ints() permet donc de retourner le code à exécuter lorsque<br />

la fonction sera réellement appelée. only_ints() ici prend en paramètre la fonction à<br />

décorer et retourne la fonction à appeler.<br />

Il est possible de passer des arguments aux decorators : l’appel devient de la forme<br />

@fonction(parametres). Dans ce cas, la fonction utilisée doit renvoyer une fonction<br />

au format decorator classique, afin de permettre à l’interpréteur d’effectuer un appel à<br />

decorateur(fonction).<br />

L’enchaînement est le suivant : l’interpréteur appelle dans un premier temps la fonction<br />

de décoration, d’une manière tout à fait classique (resultat =<br />

decorator(parametres)), puis utilise son résultat pour un appel à la fonction<br />

décorée, soit resultat(fonction).<br />

Decorator paramétré<br />

>>> def only_int(function):<br />

... def _only_int(arg):<br />

... ifnot isinstance(arg, int):<br />

... raise TypeError("'%s' doit être un int" % str(arg))<br />

... return function(arg)<br />

... return _only_int<br />

...<br />

>>> def only_long(function):<br />

... def _only_long(arg):<br />

... ifnot isinstance(arg, long):<br />

... raise TypeError("'%s' doit être un long" % str(arg))<br />

... return function(arg)<br />

... return _only_long<br />

...<br />

>>> def int_or_long(force_long):<br />

... if force_long:<br />

... return only_long<br />

... else:<br />

... return only_int<br />

...<br />

>>> @int_or_long(True)<br />

... def function(arg):<br />

... return arg + 1<br />

...<br />

>>> function(45)<br />

Traceback (most recent call last):<br />

File "", line 1, in ?<br />

File "", line 4, in only_long<br />

TypeError: '45' doit être un long<br />

>>> function(459876455L)<br />

459876456L<br />

109

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!