« Python pour le calcul scientifique/Éléments de programmation » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎Notes et références : nouv. chap. préc.
→‎Décoration : voc. : la décoration -> le décorateur
Ligne 1 187 :
}}
 
== DécorationDécorateur ==
 
UneUn décorationdécorateur est une fonction qui s'applique à une fonction, à la manière de la composition mathématique ''g'' ∘ ƒ = ''g''(ƒ). Mais cette composition affecte la fonction elle-même ; l'utilisateur appelle la fonction ƒ mais c'est la fonction ''g'' ∘ ƒ qui s'exécute. Cette fonction ''g'' est appelée lale décorationdécorateur.
 
L'intérêt est de pouvoir modifier une fonction sans modifier le code de la fonction elle-même.
 
Pour appliquer une décoration, il faut :
# Déclarer lale décorationdécorateur : une fonction qui s'applique à une autre fonction.
# Affecter lale décorationdécorateur à la fonction visée : en mettant <code>@''décoration''</code> juste avant la définition de la fonction.
 
Par exemple :
<source lang="python">
def decorationdecorateur(f):
print("Avant la fonction")
f()
print("après la fonction")
 
@decorateur
@decoration
def afficheFoo():
print("Foo.")
Ligne 1 214 :
# Après la fonction
</source>
Lorsque l'on appelle <code>foo()</code>, on appelle en fait <code>decorationdecorateur(foo())</code>.
 
Si la fonction à modifier admet des paramètres, il faut définir une fonction enveloppante dans lale décorationdécorateur. Par exemple, nous définissons ci-dessous uneun décorationdécorateur <code>deuxFois()</code> qui fait s'exécuter deux fois de suite la fonction :
 
<source lang="python">
Ligne 1 236 :
# conteneurFonction
</source>
Nous voyons que l'application de ladu décorationdécorateur a modifié le nom de la fonction — pas le nom de la variable qui contient la fonction mais bien son nom « intime ». Pour éviter cela, on utilise la méthode <code>wraps()</code> du module <code>functools</code> :
<source lang="python">
import functools