Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python
Code

No repitas tu código de Python usando decoradores

by
Length:MediumLanguages:

Spanish (Español) translation by Carlos (you can also view the original English article)

Los decoradores son una de las funciones más atractivas de Python, sin embargo, para el programador principiante, pueden parecer como magia. El propósito de este artículo es entender, en profundidad, el mecanismo detrás de los decoradores de Python.

Esto es lo que aprenderás:

  • qué son los decoradores de Python y para qué sirven
  • cómo definir nuestros propios decoradores
  • ejemplos de decoradores reales y cómo funcionan
  • cómo escribir mejor código usando decoradores

Introducción

En caso de que no hayas visto uno aún (o quizá no sabías que estabas tratando con uno de ellos), los decoradores se ven así:

Generalmente los encuentras sobre la definición de una función, y tienen el prefijo @. Los decoradores son especialmente buenos para mantener tu código bajo el principio Dry (Don't Repeat Yourself o No te repitas, en español), y lo hacen al mismo tiempo que mejoran la legibilidad de tu código.

¿Aún no está claro? No te preocupes, pues los decoradores son solamente funciones de Python. ¡Así es! Ya sabes cómo crear uno. De hecho, el principio fundamental de los decoradores es la composición de funciones. Veamos un ejemplo:

¿Qué pasa si quisiéramos crear otra función, x_plus_2_squared? Intentar componer las funciones sería inútil:

No puedes componer funciones de esta forma porque ambas funciones toman los números como argumentos. No obstante, esto funcionará:

Redefinamos cómo funciona x_squared. Si queremos que x_squared sea componible de forma predeterminada, debería:

  1. Aceptar una función como argumento
  2. Devolver otra función

Nombraremos la versión componible de x_squared simplemente como squared.

Ahora que hemos definido la función squared de forma que sea componible, podemos usarla con cualquier otra función. Aquí hay algunos ejemplos:

Podemos decir que squared decora las funciones x_plus_2, x_plus_3 y x_times_2. Estamos muy cerca de lograr la notación decoradora estándar. Mira esto:

¡Eso es! x_plus_2 es una función decorada de Python adecuada. Aquí es donde la notación @ entra en juego:

De hecho, la notación @ es una forma de «syntactic sugar» (término que quiere decir que una sintaxis está diseñada para hacer las cosas más fáciles de leer, escribir o entender). Probemos eso:

Si squared es el primer decorador que has escrito, date una gran palmada en la espalda. Has entendido uno de los conceptos más complejos de Python. Durante este proceso, aprendiste otra función fundamental de los lenguajes de programación funcional: la composición de funciones.

Crea tu propio decorador

Un decorador es una función que toma una función como argumento y devuelve otra función. Dicho lo anterior, la plantilla genérica para definir un decorador es:

En caso de que no lo supieras, puedes definir funciones dentro de las funciones. En la mayoría de los casos, decorated_function se definirá dentro de decorator.

Veamos un ejemplo más práctico:

¡Excelente! Ahora puedes estar seguro de que todo dentro de tu aplicación está estandarizado para la zona horaria UTC.

Un ejemplo práctico

Otro ejemplo de uso muy popular y clásico para los decoradores es el almacenamiento en caché del resultado de una función:

Si miras el código de manera superficial, podrías objetar. ¡El decorador no es reutilizable! Si decoramos otra función (digamos another_complex_computation) y la llamamos con los mismos parámetros, entonces obtendremos los resultados en caché de complex_computation function. Esto no ocurrirá. El decorador es reutilizable, y aquí está el porqué:

La función cached se llama una vez por cada función que decora, por lo que una variable _cache diferente crea una instancia cada vez y se guarda en ese contexto. Probemos esto:

Decoradores en el mundo real

Como habrás notado, el decorador que acabamos de codificar es muy útil. Es tan útil que ya existe una versión más compleja y robusta en el módulo estándar functools. Se llama lru_cache. LRU es la abreviatura de Least Recently Used (menos utilizado recientemente), una estrategia de almacenamiento en caché.

Uno de mis usos favoritos de los decoradores es en el web framework Flask. Es tan limpio que este fragmento de código es lo primero que ves en el sitio web de Flask. Aquí está dicho fragmento:

El decorador app.route asigna la función hello como controlador de solicitudes para la ruta "/". La simplicidad es asombrosa.

Otro uso limpio de los decoradores es dentro de Django. Generalmente, las aplicaciones web tienen dos tipos de páginas:

  1. páginas que puedes ver sin autentificarse (página principal, página de aterrizaje, entradas de blog, inicio de sesión, registro)
  2. páginas que necesitas autentificar para ver (configuración de perfil, bandeja de entrada, panel de control)

Si tratas de ver una página de este último tipo, por lo general serás redirigido a una página de inicio de sesión. Aquí está cómo implementar eso en Django:

Observa cómo las vistas privadas están marcadas con login_required. Mientras se revisa el código, está muy claro para el lector qué páginas requieren que el usuario inicie sesión y cuáles no.

Conclusiones

Espero que te hayas divertido aprendiendo sobre decoradores, ya que representan una función muy limpia de Python. Aquí hay algunos puntos a recordar:

  • El uso y el diseño correcto de los decoradores puede hacer que tu código sea mejor, más limpio y más bonito.
  • El uso de los decoradores puede ayudarte a mantener tu código bajo el principio DRY, mover el código idéntico de las funciones internas a los decoradores.
  • A medida que utilices más los decoradores, encontrarás mejores y más complejas maneras de usarlos.

Recuerda revisar lo que tenemos disponible para la venta y para estudiar en Envato Market, y no dudes en hacer cualquier pregunta y ofrecer tus valiosos comentarios utilizando el feed de abajo.

Pues bien, eso es todo sobre los decoradores. ¡Feliz «decoración»!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.