Decorador de Python que maneja las cadenas de documentación.

Tengo un problema al usar docstrings con decoradores. Dado el siguiente ejemplo:

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) 

Ahora, la ayuda no me muestra la cadena de documentación de foo como se esperaba, muestra:

 Help on function _decorator in module __main__: _decorator() 

Sin el decorador, la ayuda es correcta:

 Help on function foo in module __main__: foo() the magic foo function 

Sé que la función foo está envuelta por el decorador, por lo que el objeto function ya no es la función foo . Pero, ¿cuál es una buena solución para obtener la cadena de documentos (y la ayuda) como se esperaba?

Use functools.wraps() para actualizar los atributos del decorador:

 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) 

También vea la documentación de la biblioteca estándar para las functools .

Encontré una solución, pero no sé si es realmente agradable:

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

La parte con _decorator.__name__=f.__name__ parece un poco horrible … ¿Qué piensas?

Eche un vistazo a functools.wraps : http://docs.python.org/library/functools.html