Supongamos una función muy sencilla, pero correctamente comentada:
def suma(a, b):
'''Esta función acepta dos parámetros, y devuelve la suma de ellos.
Ejemplo:
>>> result = suma(2, 4)
>>> assert result == 6
'''
return a + b
Vemos que funciona perfectamente:
suma(2,390)
Si pedimos información de la función con
help
, nos da la documentación que incluimos como docstring:help(suma)
Vamos ahora a decorarla con un decorador muy sencillo,
simplemente escribe a consola cuando llamamos a la función y, después de
ejecutarla, imprime también el resultado:
def log(functor):
def wrapper(*args, **kwargs):
print('Llamando a la función: {}'.format(functor.__name__))
result = functor(*args, **kwargs)
print('Resultado: {}'.format(result))
return result
return wrapper
@log
def suma(a, b):
'''Esta función acepta dos parámetros, y devuelve la suma de ellos.
Ejemplo:
>>> result = suma(2, 4)
>>> assert result == 6
'''
return a + b
Vemos que el decorador funciona correctamente:
suma(2,3)
El problema es que la nueva función
suma
ha perdido todo los metadatos de la función original, entre ellos la documentación:help(suma)
suma.__name__
El decorador
wraps
del módulo functools
lo
que hace es resolver este problema, inyectando en la función decorada
todos los metadatos de la función original, entre ellos la docstring (Por eso necesita como parámetro la función original).import functools
def log(functor):
@functools.wraps(functor)
def wrapper(*args, **kwargs):
print('Llamando a la función: {}'.format(functor.__name__))
result = functor(*args, **kwargs)
print('Resultado: {}'.format(result))
return result
return wrapper
@log
def suma(a, b):
'''Esta función acepta dos parámetros, y devuelve la suma de ellos.
Ejemplo:
>>> result = suma(2, 4)
>>> assert result == 6
'''
return a + b
Vemos que todo sigue funcionando igual...
suma(2,3)
Pero la función
help
muestra la documentación de la función original...help(suma)
Añadir un comentario