63 votes

Problème avec Python Decorator avec 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 affiche:

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?

101voto

Pär Wieslander Points 11258

Utilisez functools.wraps() pour mettre à jour les attributs du décorateur:

 from functools import wraps

def decorator(f):
    @wraps(f)
    def _decorator():
        print 'decorator active'
        f()
    return _decorator

@decorator
def foo():
    '''the magic foo function'''
    print 'this is function foo'

help(foo)
 

Consultez également la documentation de la bibliothèque standard pour functools .

22voto

Günther Jehle Points 167

J'ai trouvé une solution, mais je ne sais pas si c'est vraiment sympa:

 def decorator(f):
    def _decorator():
        print 'decorator active'
        f()
    _decorator.__name__=f.__name__
    _decorator.__doc__=f.__doc__
    return _decorator
 

La partie avec _decorator.__name__=f.__name__ semble un peu hideuse ... Que pensez-vous?

4voto

Mark Byers Points 318575

Jetez un œil à functools.wraps : http://docs.python.org/library/functools.html

-2voto

gazza Points 1

C'est probablement un peu vieux maintenant, mais c'est comme ça que vous le faites. Assurez-vous simplement que @decorator est en retrait sur la même ligne que def decorator(f) :

 from functools import wraps

def decorator(f):
    @wraps(f)
    def _decorator():
        print 'decorator active'
        return f()
    return _decorator

@decorator
def foo():
    '''the magic foo function'''
    print 'this is function foo'

help(foo)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X