AurumCourses
CursosDocsBlog
RoadmapRanking
Tutorial Reto DiarioPLAYGROUNDARENA
EntrarCrear Cuenta
Aurum Courses LogoAurum Courses LogoAurumCourses

La plataforma definitiva para evaluar y mejorar tus habilidades como desarrollador web.

Plataforma

  • Cursos
  • Documentación
  • Blog Técnico
  • Mi Perfil y Progreso
Institucional
  • Sobre Nosotros
  • Contacto
  • Privacidad
  • Términos
  • Cookies

Nuestra Red

  • Aurumdux
  • MiniDuxTools
© 2026 Aurum-Courses. Todos los derechos reservados.

Desarrollado por Aurumdux

Docs/Python/Decoradores y Funciones de Orden Superior
Intermediopython

Decoradores y Funciones de Orden Superior

Aprende a extender y modificar el comportamiento de funciones y métodos usando decoradores en Python.

Funciones como ciudadanos de primera clase

En Python, las funciones pueden asignarse a variables, pasarse como argumentos y devolverse desde otras funciones. Un decorador es simplemente una función que recibe otra función como argumento y devuelve una versión mejorada de ella.
python
1def mi_decorador(func):
2    def wrapper(*args, **kwargs):
3        print("Antes de ejecutar la función...")
4        resultado = func(*args, **kwargs)
5        print("Después de ejecutar la función...")
6        return resultado
7    return wrapper
8
9@mi_decorador
10def saludar(nombre):
11    print(f"Hola, {nombre}!")
12
13saludar("Carlos")

Preservar metadatos con functools.wraps

Al envolver una función, se pierde su nombre original (__name__) y su docstring (__doc__). La solución profesional es usar el decorador @wraps del módulo estándar functools.
python
1from functools import wraps
2import time
3
4def medir_tiempo(func):
5    @wraps(func)
6    def wrapper(*args, **kwargs):
7        inicio = time.time()
8        res = func(*args, **kwargs)
9        fin = time.time()
10        print(f"[{func.__name__}] tardó {fin - inicio:.4f}s")
11        return res
12    return wrapper
13
14@medir_tiempo
15def calculo_pesado():
16    """Realiza un cálculo intensivo."""
17    return sum(i * i for i in range(1_000_000))
18
19calculo_pesado()
20print(calculo_pesado.__name__) # Imprime "calculo_pesado", no "wrapper"
← AnteriorModulos y PaquetesSiguiente →Programación Asíncrona con Asyncio