Chaining Decorators
Leçon 7 sur 12 du cours Les décorateurs Python de Coddy.
Il est possible d'enchaîner plusieurs décorateurs pour modifier le comportement d'une fonction. Pour enchaîner des décorateurs, il suffit de les appliquer l'un après l'autre, le décorateur le plus interne étant le plus proche de la fonction décorée.
Voici un exemple :
def make_bold(func):
def wrapper():
return "<b>" + func() + "</b>"
return wrapper
def make_italic(func):
def wrapper():
return "<i>" + func() + "</i>"
return wrapper
@make_bold
@make_italic
def hello():
return "Hello, world!"
print(hello())Le résultat final est :
<b><i>Hello, world!</i></b>Notez que dans l'exemple ci-dessus, le décorateur renvoie la valeur de la fonction ; jusqu'à présent, nous n'avions vu que des décorateurs qui exécutent la fonction sans renvoyer son résultat !
Défi
MoyenÉcrivez une fonction appelée my_decorator qui prend un argument entier n et retourne une fonction décoratrice qui enveloppe une fonction donnée func dans n couches de balises HTML. La balise la plus externe doit être <div>, la couche suivante doit être <p>, et ainsi de suite, chaque couche suivante alternant entre les balises <div> et <p>. La couche la plus interne doit envelopper la sortie de la fonction dans des balises <b>.
Le code qui sera exécuté avec my_decorator vous est fourni, ne le modifiez pas !
Exemple :
@my_decorator(3)
def my_function(s):
return s.upper()
result = my_function("hello world")
print(result)Sortie :
<div>
<p>
<div>
<b>
HELLO WORLD
</b>
</div>
</p>
</div>Utilisez des sauts de ligne (
\n) pour formater la sortie correctement !
Essayez vous-même
# Écrivez le code ici
# Ne modifiez pas ce qui se trouve sous cette ligne
n = int(input())
@my_decorator(n)
def my_function(s):
return s.upper()
result = my_function(input())
print(result)Toutes les leçons de Les décorateurs Python
Entraînez-vous par vous-même : Compilateur Python en ligne