Outils pour utilisateurs

Outils du site


python:decorateurs

Ceci est une ancienne révision du document !


Décorateurs Python

Built-in decorator

  • @property : transforme une fonction en propriété (en gros transforme une fonctionne comme une variable)

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

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.1335458265.txt.gz · Dernière modification : 2012/04/26 16:37 de root