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

Comment « functools.wraps » préserve-t-il les attributs de fonction d'origine dans les décorateurs Python ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 21:10:15238parcourir

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

Comprendre functools.wraps

Dans la programmation Python, les décorateurs sont couramment utilisés pour ajouter des fonctionnalités aux fonctions. Cependant, l'utilisation de décorateurs peut parfois remplacer la fonction d'origine par une nouvelle, entraînant la perte d'attributs de fonction importants tels que le nom, la docstring et la liste d'arguments.

C'est là que functools.wraps entre en jeu. C'est un décorateur qui permet aux utilisateurs de conserver les attributs de la fonction d'origine lors de l'application d'un décorateur. Essentiellement, il « enveloppe » la nouvelle fonction créée par le décorateur avec les attributs de la fonction d'origine.

Considérez 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

Lorsque vous utilisez ce décorateur, il garantit que la fonction conserve son nom d'origine, sa docstring et sa liste d'arguments, même si elle a été modifiée par la fonctionnalité de journalisation. Voici un exemple de son fonctionnement :

@logged
def f(x):
    """does some math"""
    return x + x * x

print(f.__name__)  # prints 'f'
print(f.__doc__)   # prints 'does some math'

Sans functools.wraps, le décorateur aurait remplacé la fonction originale par une nouvelle fonction avec un nom différent et sans docstring, ce qui rendrait difficile son identification et son interprétation. le comportement de la fonction.

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