Si hago lo siguienteCopiar firma llamada al decorador
def mydecorator(f):
def wrapper(*args, **kwargs):
f(*args, **kwargs)
wrapper.__doc__ = f.__doc__
wrapper.__name__ = f.__name__
return wrapper
@mydecorator
def myfunction(a,b,c):
'''My docstring'''
pass
Y a continuación, escriba help myfunction
, me sale:
Help on function myfunction in module __main__:
myfunction(*args, **kwargs)
My docstring
Así que el nombre y la cadena de documentación se copian correctamente terminado. ¿Hay alguna forma de copiar también la firma de llamada real, en este caso (a, b, c)
?
Esta es una buena respuesta, pero crea una dependencia en otro tercero no oficial. ¿Hay una manera simple de hacer esto sin usar el módulo decorador? –
El módulo 'decorator' es un único archivo que consta de <250 líneas. No creo que ripear las partes relevantes te ahorrará mucho código. La forma más fácil es instalar el módulo decorador. Tenga en cuenta que si no puede instalarlo en todo el sistema, siempre puede guardar una copia local de 'decorator.py' en un directorio de su PYTHONPATH. – unutbu
Esta solución no se ajusta a mi problema porque 'decorator' supone que se realiza poco o ningún trabajo en la función del decorador principal, y la mayor parte del trabajo se realiza en la función interna devuelta. Ese no es mi caso: trabajo mucho antes de definir mi función devuelta. Además, asume que realmente llamaré a la función orinal desde el interior de la función devuelta, lo que no haré (es un sistema RPC), por lo que no tengo uso para la función recibida como el primer parámetro. – lvella