Maison >développement back-end >Tutoriel Python >Comment conserver la signature des fonctions décorées en Python ?
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 :
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!