Exercices Fonctions & Modules Decorateur avec functools.wraps
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Decorateur avec functools.wraps

Quand tu utilises un decorateur, la fonction decoree perd son nom et sa docstring. Regarde :

def mon_deco(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

@mon_deco
def saluer():
'''Dit bonjour'''
return 'bonjour'

saluer.__name__ vaut 'wrapper' au lieu de 'saluer'
saluer.__doc__ vaut None au lieu de 'Dit bonjour'

Pour eviter ce problème, Python fournit functools.wraps. C'est un decorateur que tu appliques sur le wrapper pour copier le nom, la docstring et d'autres attributs de la fonction originale.

from functools import wraps
def mon_deco(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper

Écris un decorateur logger qui affiche le nom de la fonction avant de l'appeler (avec print), puis renvoie le résultat. Utilise functools.wraps pour preserver le nom et la docstring.

Exemple :
@logger
def calculer(x):
'''Calcule le double'''
return x * 2

calculer.__name__ vaut 'calculer'
calculer.__doc__ vaut 'Calcule le double'

Tests (3/4)

Nom preserve
@logger
def calculer(x):
    '''Calcule le double'''
    return x * 2
assert calculer.__name__ == 'calculer'
Docstring preservee
@logger
def calculer(x):
    '''Calcule le double'''
    return x * 2
assert calculer.__doc__ == 'Calcule le double'
Résultat correct
@logger
def double(x):
    '''Double'''
    return x * 2
assert double(5) == 10

+ 0 tests cachés

Indices (3 disponibles)

solution.py