Maison > développement back-end > Tutoriel Python > Comment « functools.wraps » préserve-t-il les métadonnées de fonction dans les décorateurs Python ?

Comment « functools.wraps » préserve-t-il les métadonnées de fonction dans les décorateurs Python ?

Mary-Kate Olsen
Libérer: 2024-11-30 05:52:22
original
667 Les gens l'ont consulté

How Does `functools.wraps` Preserve Function Metadata in Python Decorators?

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
Copier après la connexion

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'
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal