¿Para qué se usa functools.wraps dentro de un decorator?
Opciones
- Hace que el wrapper se ejecute más rápido al saltarse una llamada
- Copia
__name__y__doc__de la función original (Opción correcta) - Permite que el decorator acepte argumentos cuando se aplica al código
- Guarda en caché el resultado de la función entre dos llamadas
Respuesta
Copia los metadatos (__name__, __doc__, __wrapped__) de la función original al wrapper
Por qué
Un decorator reemplaza tu función por otra nueva (el wrapper). Sin @wraps, el resultado parece el wrapper: su nombre pasa a ser 'wrapper' y tu docstring desaparece.
Eso confunde a los logs, los debuggers, las herramientas de documentación y los frameworks que usan el nombre de la función.
@functools.wraps(func) copia el nombre, el docstring y otros metadatos de la función original al wrapper.
Recuerda
Pon siempre @functools.wraps(func) en el wrapper interno.