Les décorateurs python

Un décorateur est une fonction qui modifie le comportement d'autres fonctions.

Les décorateurs sont utiles lorsque l'on veut ajouter du même code à plusieurs fonctions existantes.

Créer un décorateur python

Prenons l'exemple d'une fonction qui n'a le droit d'être executée uniquement si l'utilisateur est "olivier".

#!/usr/bin/python2.7
#-*- coding: utf-8 -*-

user = "olivier"

def mon_decorateur(fonction):

    def autre_fonction():
        print "Action refusée"

    if user <> "olivier":
        return autre_fonction

    return fonction 


@mon_decorateur
def do_that():
    print "Execution des instructions"
>>> do_that()
Execution des instructions

Changeons la valeur de la variable user.

user = "jean-louis"

Exécutons à nouveau la fonction do_that.

>>> do_that()
Action refusée

Voila, nous avons réussi à interdire l'exécution de la fonction do_that si l'utilisateur n'est pas "olivier".

Prendre en compte les paramètres

Le décorateur peut prendre en compte les paramètres de notre fonction initiale de cette manière:

#!/usr/bin/python2.7
#-*- coding: utf-8 -*-

def mon_decorateur(fonction):

    def autre_fonction(*param, **param2):
        print "Action avant .............. "
        fonction(*param, **param2)
        print "Action après .............."

    return autre_fonction


@mon_decorateur
def do_that(v):
    print "Execution des instructions %s" % v

Exécutons la fonction do_that.

>>> do_that("delete")
Action avant .............. 
Execution des instructions delete
Action après ..............

Plusieurs décorateurs

Il est évidemment possible d'attribuer plusieurs décorateurs à une fonction:

@decorateur1
@decorateur2
def ma_fonction():