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

Patricia Arquette
Libérer: 2024-10-17 17:02:02
original
573 Les gens l'ont consulté

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

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

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
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!