J'ai un problème en utilisant docstrings avec des décorateurs. Compte tenu de l'exemple suivant:Python décorateur manipulant docstrings
def decorator(f):
def _decorator():
print 'decorator active'
f()
return _decorator
@decorator
def foo():
'''the magic foo function'''
print 'this is function foo'
help(foo)
Maintenant, l'aide ne me montre pas le docstring de foo
comme prévu, il montre:
Help on function _decorator in module __main__:
_decorator()
Sans le décorateur, l'aide est correcte:
Help on function foo in module __main__:
foo()
the magic foo function
Je sais, que la fonction foo
est enveloppée par le décorateur, et donc l'objet fonction n'est plus la fonction foo
. Mais quelle est la bonne solution pour obtenir la docstring (et l'aide) comme prévu?
Cela ne fonctionne pas si 'foo' prend n'importe quel argument - ils sont remplacés par tout ce que' _decorator' utilise. C'est un problème surtout quand vous voulez que votre décorateur prenne '* args, ** kwds'. Je n'ai jamais réussi à trouver un moyen d'obtenir la docstring correcte en utilisant 'functools.wraps'. –
@Scott Griffiths: La docstring sera toujours correcte même si 'foo' prend des arguments. Cependant, 'help (foo)' affichera la liste des paramètres de '_decorator', car elle remplace réellement la fonction' foo'. Il n'y a pas de bonne solution si vous écrivez des décorateurs qui prennent des arguments arbitraires en utilisant '* args, ** kwargs', mais pour moi, le point important est que la docstring reste intacte. Les détails des paramètres peuvent toujours être spécifiés dans la docstring pour plus de clarté. –
Merci pour les informations supplémentaires. J'ai récemment échoué à obtenir la description de l'aide correcte pour les fonctions décorées - cela semble être un mauvais état de choses, mais je comprends la difficulté car la fonction décorée pourrait avoir une signature complètement différente. Pourtant, il doit y avoir un moyen ... :) –