17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Structuration du code<br />

CHAPITRE 5<br />

Pour simplifier l’écriture, les decorators introduisent un nouveau mécanisme qui<br />

permet de spécifier qu’une fonction est encapsulée dans une deuxième fonction.<br />

Il suffit de préfixer la définition de la fonction à encapsuler par le nom de la<br />

deuxième fonction préfixé d’une arobase (@).<br />

Définition d’un decorator<br />

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

... function.__doc__ = 'Fonction décorée %s' % function.__doc__<br />

... return function<br />

...<br />

>>> @decorate<br />

... def a_function():<br />

... """Ma fonction."""<br />

... print('traitement')<br />

...<br />

>>> print a_function.__doc__<br />

Fonction décorée ma fonction<br />

Plusieurs decorators peuvent êtres utilisés sur la même fonction : ils sont imbriqués<br />

dans l’ordre de déclaration.<br />

Enchaînement de decorators<br />

@f1 @f2 @f3<br />

def a_function():<br />

pass<br />

Cette notation étant équivalente à l’écriture ci-dessous :<br />

Équivalent explicite<br />

function = f1(f2(f3(function)))<br />

Les decorators servent également à la mise en place de code patterns récurrents,<br />

comme le contrôle de types de paramètres entrants, d’enrichissement du contexte<br />

d’exécution ou de tout mécanisme pré ou post-exécution. La fonction décoratrice est<br />

déclarée une bonne fois pour toute et réutilisée en decorator.<br />

Contrôle d’argument<br />

>>> def only_ints(func):<br />

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

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

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

107

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

Saved successfully!

Ooh no, something went wrong!