jueves, 18 de marzo de 2010

Otro cuento sobre decoradores en Python

Al buscar información sobre ¿cómo funcionan los decoradores en Python?, normalmente nos encontramos con que: es una función que es pasada como parámetro a otra y retorna una función modificada, otra definición es: una función (a) pasada a una función (c) para retornar una función (b). Bueno la verdad es que ninguna de estos conceptos son digeribles.

Buscando una manera de tratar de explicar mi modo de entender los decoradores, he preparado el siguiente ejemplo:

Crearemos una función llamada (suma)  el cual tendrá como menester recibir dos parámetros (a) y (b) y otorgar a la variable (c) la suma de (a) + (b) para luego retornar el valor de la suma contenido en (c), la función es la siguiente.


En este momento podríamos utilizar la función (suma), por ejemplo:
>>>print suma(1,2)

3

Ahora crearemos un decorador que tendrá como finalidad recibir la función (suma) como parámetro, evaluar el valor (c) retornado por (suma) y verificar si es divisible entre 2, si es verdadero retornará un string ("si") de lo contrario retornará un string ("no"), la función es la siguiente.



Para decorar la función (suma), lo haremos agregando un (@) seguido del nombre de la función decoradora (@numero_divisible) antes de definir la función (suma), quedara de la siguiente manera:



En este momento la función (suma) ya está decorada y a diferencia de cuando no lo estaba , ahora si la utilizamos no tendremos el valor de la suma de (a+b), sino nos imprimirá en pantalla si es divisible o no entre 2, ejemplo:
>>>print suma(1,2)

no

Pero todavía no es fácil comprender que es lo que pasa con todo esto, en la siguiente imagen pueden observar de una manera gráfica que es lo que la función (suma) puede pasar la función decoradora (numero_divisible):



En verde se encuentran los valores que podemos acceder desde el decorador, para codificarlos, procesarlos y luego retornarlos. Luego este otro gráfico nos muestra como se reciben estos valores y se procesan, para retornar un valor totalmente nuevo.



Teniendo en el valor (f) el valor de (c) de la función de (suma), se evalúa si f es divisible entre 2 (if f % 2 ==1) si es igual a (1) retorna  ("no"), de lo contrario retorna ("si"), si quisiéramos en vez de retornar un string ("si") ó ("no"), convertir este decorador para hacer que la función (suma) siempre sea igualado a un valor par divisible entre 2. debe ser así:




Otro ejemplo es que el decorador retorne el valor de la (suma) multiplicado por el primer parámetro (a) pasado a la función (suma):




Así entonces hemos examinado tres ejemplos rápidos y sencillos, se puede decir que un decorador es una función construida para recibir otra función que no queremos modificar explicitamente y modificar sus resultados.






2 comentarios:

  1. mira en los primiros paragrafos entiendo bien, pero despues me pierdo.
    te digo gracias por ese trabojo, que me ha dado una idea de lo que es
    un decoradore.

    ResponderEliminar
  2. Gracias, he logrado entender la idea.

    ResponderEliminar