Maison >développement back-end >Tutoriel Python >Comment préserver les signatures des fonctions décorées

Comment préserver les signatures des fonctions décorées

Barbara Streisand
Barbara Streisandoriginal
2024-10-17 16:59:02900parcourir

How to Preserve Signatures of Decorated Functions

Préserver les signatures des fonctions décorées

Le problème survient lors de la décoration d'une fonction avec un décorateur générique qui modifie les arguments de la fonction, tels que la conversion de type, la journalisation ou la mémorisation. La fonction décorée ne parvient pas à hériter de la documentation et de la signature de la fonction d'origine, ce qui rend difficile la compréhension de son comportement.

Pour résoudre ce problème, plusieurs solutions de contournement ont été proposées :

Méthode 1 : utiliser l'option ' Module Decorator

Installez le module 'decorator' à l'aide de pip et modifiez la définition du décorateur pour inclure l'annotation decorator.decorator. Cela garantit que le décorateur reste générique tout en préservant la signature de la fonction :

<code class="python">import decorator

@decorator.decorator
def args_as_ints(f, *args, **kwargs):
    # Perform argument conversion
    return f(*args, **kwargs)</code>

Méthode 2 : Utiliser 'functools.wraps()'

Pour Python 3.4 et supérieur, 'functools.wraps( )' propose une solution alternative qui préserve automatiquement à la fois la signature et la documentation de la fonction :

<code class="python">import functools

def args_as_ints(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        # Perform argument conversion
        return func(*args, **kwargs)
    return wrapper</code>

Conclusion

Les deux méthodes préservent efficacement la signature et la documentation de la fonction d'origine. Le module 'decorator' convient à Python 2 et 3, tandis que 'functools.wraps()' n'est disponible qu'en Python 3.4 et supérieur.

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