Maison >développement back-end >Tutoriel Python >Comment conserver la signature des fonctions décorées en Python ?

Comment conserver la signature des fonctions décorées en Python ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-17 17:02:02685parcourir

How to Preserve the Signature of Decorated Functions in Python?

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

Les décorateurs sont des outils puissants en Python pour étendre le comportement des fonctions existantes. Cependant, lorsqu'elle est appliquée à une fonction, la fonction décorée qui en résulte perd souvent sa documentation et sa signature originales. Cela peut être problématique, en particulier lors de l'utilisation de décorateurs génériques qui effectuent des tâches courantes telles que la journalisation ou la conversion d'arguments.

Solutions de contournement courantes

Certaines solutions de contournement courantes incluent :

  • Inclure la signature dans la docstring de la fonction décorée.
  • Créer des décorateurs spécialisés pour chaque signature spécifique.

Utiliser le module décorateur

Une solution plus robuste consiste à utiliser le module décorateur, qui fournit une fonction de décorateur appelée @decorator.decorator. En appliquant ce décorateur à votre propre fonction de décorateur, vous pouvez conserver la signature de la fonction d'origine.

<code class="python">import decorator

@decorator.decorator
def args_as_ints(f, *args, **kwargs):
    args = [int(x) for x in args]
    kwargs = dict((k, int(v)) for k, v in kwargs.items())
    return f(*args, **kwargs)

@args_as_ints
def funny_function(x, y, z=3):
    """Computes x*y + 2*z"""
    return x*y + 2*z

print(funny_function("3", 4.0, z="5"))  # 22
help(funny_function)
# Help on function funny_function in module __main__:
#
# funny_function(x, y, z=3)
#     Computes x*y + 2*z</code>

Python 3.4

Dans Python 3.4 et versions ultérieures, le La fonction functools.wraps() peut être utilisée pour conserver les signatures.

<code class="python">import functools

def args_as_ints(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        args = [int(x) for x in args]
        kwargs = dict((k, int(v)) for k, v in kwargs.items())
        return func(*args, **kwargs)
    return wrapper

@args_as_ints
def funny_function(x, y, z=3):
    """Computes x*y + 2*z"""
    return x*y + 2*z

print(funny_function("3", 4.0, z="5"))  # 22
help(funny_function)
# Help on function funny_function in module __main__:
#
# funny_function(x, y, z=3)
#     Computes x*y + 2*z</code>

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