Python décorateur de manutention docstrings
J'ai un problème à l'aide de docstrings avec des décorateurs. Soit l'exemple suivant:
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'aider à ne pas me montrer la docstring de foo
comme prévu, il montre:
Help on function _decorator in module __main__:
_decorator()
Sans le décorateur, l'aide est correct:
Help on function foo in module __main__:
foo()
the magic foo function
Je sais que la fonction foo
est enveloppé par le décorateur, et donc la fonction de l'objet n'est pas la fonction foo
plus. Mais ce qui est une belle solution pour obtenir la docstring (et l'aide) comme prévu?
Vous devez vous connecter pour publier un commentaire.
Utilisation
functools.wraps()
de mettre à jour les attributs de la décoratrice:Également voir le La documentation de la Bibliothèque Standard pour
functools
.foo
prend tous les arguments - ils remplacés par ce que le_decorator
utilise. C'est un problème surtout quand vous voulez votre décorateur à prendre*args, **kwds
. Je n'ai jamais été en mesure de trouver un moyen d'obtenir la docstring corriger à l'aide defunctools.wraps
.foo
des arguments. Cependant,help(foo)
affiche la liste des paramètres de l'_decorator
, puisqu'il remplace lefoo
fonction. Il n'y a pas de bonne façon de contourner ce problème si vous écrivez des décorateurs qui prennent des arguments arbitraires à l'aide de*args, **kwargs
, mais pour moi, le point important est que la docstring est conservé intact. Détails des paramètres pourrait toujours être spécifiée dans la docstring pour plus de clarté.help()
pour fonctionner correctement maintenant. J'ai du mal à trouver lorsque cela a changé, mais je suis toujours à l'aide de Python 2.7. Heureux jour!@classmethod
?_decorator.__doc__ += '\n(decorated by <decorator description>)'
juste avantreturn _decorator
? Semble que ce serait faire de la docstring plus instructif, mais je n'ai pas vu que, si vous vous demandez si il y a une raison de ne pas le faire.J'ai trouvé une solution, mais ne sais pas si c'est vraiment gentil:
La partie avec
_decorator.__name__=f.__name__
semble un peu hideux... Qu'en pensez-vous?Prendre un coup d'oeil à
functools.wraps
: http://docs.python.org/library/functools.html