J'ai une collection de fonctions avec (principalement) des paramètres partagés mais des processus différents. J'aimerais utiliser un décorateur pour ajouter la description de chaque paramètre à la docstring de niveau titre d'une fonction.Décorateurs avec paramètres
J'ai essayé d'imiter la structure trouvée dans this answer en incorporant une fonction imbriquée dans appender
mais échoué. J'ai également essayé functools.partial
mais quelque chose est légèrement éteint.
Ma tentative:
def appender(func, *args):
"""Appends additional parameter descriptions to func's __doc__."""
def _doc(func):
params = ''.join([defaultdocs[arg] for arg in args])
func.__doc__ += '\n' + params
return func
return _doc
defaultdocs = {
'a' :
"""
a : int, default 0
the first parameter
""",
'b' :
"""
b : int, default 1
the second parameter
"""
}
@appender('a')
def f(a):
"""Title-level docstring."""
return a
@appender('a', 'b')
def g(a, b):
"""Title-level docstring."""
return a + b
Cela échoue, et elle échoue, je crois que le premier arg passé à appender
est interprété comme func
. Alors, quand je vois le résultat docstring pour g
je reçois:
print(g.__doc__)
Title-level docstring.
b : int, default 1
the second parameter
parce que, encore une fois, 'a'
est interprété comme 'func'
quand je veux que ce soit le premier élément de *args
. Comment puis-je corriger cela?
Résultat souhaité:
print(g.__doc__)
Title-level docstring.
a : int, default 0
the first parameter
b : int, default 1
the second parameter