Anuncios

Bienvenidos sean a este post, en los posts anteriores hablamos sobre los decoradores pero hoy veremos como implementar el concepto de fabrica para este paradigma.

Anuncios

Vamos a tomar el ejemplo del post anterior donde tenemos un decorador que determina cual es el resultado maximo en base a un limite establecido pero si nosotros necesitamos variar ese limite en varias partes del codigo, como hariamos? Aqui entra en accion el concepto de la fabrica para poder crear el mismo decorador pero con distintos valores, para ello utilizaremos el siguiente codigo:

>>> from functools import wraps
>>> 
>>> def resultado_maximo(limite):
...     def decorador(funcion):
...             @wraps(funcion)
...             def envoltorio(*args, **pcargs):
...                     texto = "Resultado demasiado grande ({0})."
...                     texto += " Maximo permitido es {1}"
...                     resultado = funcion(*args, **pcargs)
...                     if resultado > limite :
...                             print(texto.format(resultado, limite))
...                     return resultado
...             return envoltorio
...     return decorador
... 
>>>
Anuncios
Anuncios

Como siempre primero debemos importar a wraps del modulo de functools, les recomiendo hacerlo siempre que usen decoradores, luego crearemos una nueva funcion de resultados maximo pero en lugar de recibir una funcion recibira un valor el cual lo usaremos como limite, luego tenemos una funcion llamada decorador la cual si recibe la funcion, aqui si usaremos a wraps para lo que hablamos en el post anterior, despues vendra la funcion de envoltorio que recibira los argumentos, esto es poco practico pero no queria que el codigo quede feo, lo siguiente es el texto que usaremos para mostrar como nuestro limite en caso de excedernos, observen que inclui el formateador de texto para pasar dos valores que ya veremos, lo siguiente es la variable que almacen el objeto creado por la funcion que informemos, despues por medio de un condicional verificamos si el resultado es mayor al limite y en caso de ser verdadero procede a mostrarnos el mensaje anterior y por medio de format enviamos el valor de resultado para asignar al campo 0 de texto y luego el limite para el campo 1 de texto, por ultimo devolvemos a resultado, luego devolvemos a envoltorio y por ultimo al decorador, primero implementemos la fabrica recien descripta:

>>> @resultado_maximo(75)
... def cubo(n):
...     return n ** 3
... 
>>>
Anuncios

En este caso vemos como pasamos la funcion con un valor que sera nuestro limite, luego le definimos una funcion para calcular el cubo de un valor informado, pasemos a probarlo para verlo en accion:

>>> print(cubo(3))
27
>>> print(cubo(5))
Resultado demasiado grande (125). Maximo permitido es 75
125
>>>
Anuncios

Observen como al probarlo obtenemos el resultado solamente y en el segundo caso obtenemos la notificacion donde podemos ver cual es el valor que obtuvimos y se excedio por el limite que tiene establecido, vamos a suponer que tenemos un codigo y debemos volver a utilizar este limitador, probemos con varios valores y funciones:

>>> @resultado_maximo(100)
... def cuadrado(n):
...     return n ** 2
... 
>>> @resultado_maximo(1000)
... def multiplicar(a, b):
...     return a * b
... 
>>>
Anuncios

Como pueden observar ahora tenemos dos funciones mas con el decorador de resultado_maximo, vamos a hacer algunas pruebas para verlo en accion:

>>> print(cubo(7))
Resultado demasiado grande (343). Maximo permitido es 75
343
>>> print(cuadrado(11))
Resultado demasiado grande (121). Maximo permitido es 100
121
>>> print(multiplicar(121,100))
Resultado demasiado grande (12100). Maximo permitido es 1000
12100
>>>
Anuncios

Aca podemos ver como establecimos un limite para tres funciones distintas, cada uno con su valor y su respectiva funcion sin afectar a las otras, por esta razon en algunas ocasiones es una buena idea convertir a nuestro decorador en una fabrica para crear una mejor reutilizacion del mismo.

Anuncios

En resumen, hoy hemos visto como implementar el concepto de fabrica para un decorador, hemos visto como no difiere mucho del concepto original pero si nos permite poder reutilizarlo sin afectar a los anteriormente creados, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.00