Maison >développement back-end >Tutoriel Python >Que fait « functools.wraps » dans les décorateurs Python ?

Que fait « functools.wraps » dans les décorateurs Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 04:33:17804parcourir

What Does `functools.wraps` Do in Python Decorators?

Dévoilement des fonctionnalités de functools.wraps

Dans le domaine des décorateurs Python, la question se pose : quel est le but de functools.wraps ?

Compréhension Décorateurs

Les décorateurs nous permettent d'améliorer les fonctionnalités des fonctions existantes en les enveloppant avec une logique personnalisée. Cependant, ce processus d'encapsulage peut entraîner la perte des métadonnées associées à la fonction d'origine, à savoir son nom, sa documentation et sa liste d'arguments.

Présentation de functools.wraps

C'est là que functools.wraps entre en jeu. C'est un décorateur qui s'attaque au problème de la perte de métadonnées. En appliquant @wraps(func) à une fonction de décorateur, nous demandons au décorateur d'hériter des métadonnées de la fonction d'origine.

Comment fonctionne functools.wraps

  • Préserve le nom de la fonction : Empêche le remplacement du nom de la fonction décorée par le nom de la fonction. décorateur.
  • Maintient Docstring : Copie la documentation de la fonction d'origine dans la fonction décorée.
  • Conserver les arguments : Garantit que la fonction décorée conserve la même signature d'argument comme fonction d'origine.

Exemple Utilisation

Considérons l'exemple suivant :

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):
    """Computes a mathematical operation."""
    return x + x * x

En appliquant @wraps(func) au décorateur connecté, nous nous assurons que la fonction enveloppée f conserve son nom d'origine, sa documentation, et liste d'arguments :

  • print(f.__name__) sorties 'f'
  • print(f.__doc__) imprime 'Calcule une opération mathématique.'

Conclusion

functools.wraps joue un rôle crucial dans la préservation des métadonnées des fonctions enveloppées par les décorateurs, garantissant que les informations essentielles ne sont pas perdues. En utilisant @wraps(func), nous pouvons créer des décorateurs flexibles et informatifs qui améliorent efficacement le comportement des fonctions sans compromettre leurs caractéristiques d'origine.

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!

Déclaration:
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