Dévoilement des mystères de functools.wraps : maintenance des métadonnées de fonction
Les décorateurs jouent un rôle crucial dans l'extension des fonctionnalités des fonctions Python. Cependant, ils se font souvent au prix de la perte de métadonnées de fonction importantes telles que le nom, la docstring et la liste d'arguments. Heureusement, functools.wraps apparaît comme un sauveur, préservant ces informations inestimables.
Lors de l'application d'un décorateur, la fonction d'origine est remplacée par une fonction wrapper, ce qui entraîne l'obscurcissement de certains détails clés. Par exemple, considérons l'exemple suivant :
def logged(func): def with_logging(*args, **kwargs): print(func.__name__ + " was called") return func(*args, **kwargs) return with_logging @logged def f(x): """does some math""" return x + x * x
Si vous exécutez print(f.__name__), cela donnera "with_logging" et f.__doc__ renverra une chaîne vide. Cette conséquence survient parce que la fonction wrapper with_logging a remplacé f.
functools.wraps résout ce problème en encapsulant la fonction décorateur et en garantissant que les métadonnées de la fonction décorée restent intactes. En appliquant @wraps(func) à la fonction interne, comme vu ci-dessous, nous restaurons le comportement souhaité :
from functools import wraps def logged(func): @wraps(func) def with_logging(*args, **kwargs): print(func.__name__ + " was called") return func(*args, **kwargs) return with_logging @logged def f(x): """does some math""" return x + x * x print(f.__name__) # prints 'f' print(f.__doc__) # prints 'does some math'
Dans cet exemple révisé, f.__name__ affiche "f" et f.__doc__ reflète correctement la docstring de la fonction d'origine. La préservation des métadonnées est cruciale pour maintenir l'identité, la documentation et les capacités d'introspection de la fonction.
N'oubliez donc pas que functools.wraps est un outil essentiel dans la boîte à outils du décorateur, protégeant contre la perte d'informations et garantissant que vos fonctions décorées conservent leur attributs prévus.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!