python:decorateurs
Ceci est une ancienne révision du document !
−Table des matières
Décorateurs Python
Sans arguments
def decorate(func): def wrapper(*args, **kwargs): # Pré-traitement response = func(*args, **kwargs) # Post-traitement return response return wrapper
Exemple :
# -*- coding: utf-8 -*- # Notre décorateur def decorate(func): print u"Je suis dans la fonction 'decorate' et je décore '%s.'" % func.__name__ def wrapper(*args, **kwargs): print u"Je suis dans la fonction 'wrapper' qui accède aux arguments de '%s'." % func.__name__ a = list(args) a.reverse() print u"J'en donne la preuve, je peux les inverser : %s." % ', '.join(a) print u"Exécution de la fonction '%s'." % func.__name__ response = func(*args) print u"Je peux effectuer, ici, un post-traitement." return response return wrapper # Notre fonction décorée @decorate def foobar(*args): print ", ".join(args) # Appel de la fonction foobar("A", "B", "C", "D")
Avec arguments
Source : http://gillesfabio.com/blog/2010/12/16/python-et-les-decorateurs/
def decorate(arg1, arg2, arg3): def decorated(func): def wrapper(*args, **kwargs): # Pré-traitement response = func(*args, **kwargs) # Post-traitement return response return wrapper return decorated
def decorate(arg1='default', arg2=None, arg3=None): def decorated(func): def wrapper(*args, **kwargs): # Pré-traitement response = func(*args, **kwargs) # Post-traitement return response return wrapper return decorated @decorate(arg1='my value') def foobar(): pass
# MAUVAIS @decorate def foobar(): pass # BON @decorate() def foobar(): pass
Exemple :
# -*- coding: utf-8 -*- def decorate(arg1, arg2, arg3): print u'Je suis dans la fonction "decorate".' def decorated(func): print u'Je suis dans la fonction "decorated".' def wrapper(*args, **kwargs): print u'Je suis dans la fonction "wrapper".' print u"Les arguments du décorateurs sont : %s, %s, %s." % (arg1, arg2, arg3) print u"Pré-traitement." print u"Exécution de la fonction %s." % func.__name__ response = func(*args, **kwargs) print u"Post-traitement." return response return wrapper return decorated @decorate("Arg 1", "Arg 2", "Arg 3") def foobar(): print u"Je suis foobar, je vous reçois 5 sur 5." foobar()
python/decorateurs.1335101077.txt.gz · Dernière modification : 2012/04/22 13:24 de root