[pyar] Patrones de diseño: Strategy

Matías Bellone matiasbellone en gmail.com
Mar Feb 20 17:02:40 -03 2018


Si podés "calcular" el nombre de la función a ejecutar (o método de una
clase), podés hacerlo de la siguiente forma:

from os.path import splitext class Lector(): def
leer_de_extension(nombre_archivo): _, extension = splitext(nombre_archivo)
funcion = getattr(self, 'leer_{}'.format(extension))
funcion(nombre_archivo) def leer_jpg(archivo): <CODIGO> def
leer_png(archivo): <CODIGO> lector = Lector() lector('archivo.jpg')
lector('archivo.png')

El truco, obviamente está en leer_de_extension. Lo metí en una clase para
hacer más fácil el uso de getattr con self, caso contrario tenés que hacer
cosas con el diccionario locals.

Saludos,
Toote

2018-02-20 16:44 GMT-03:00 Luis Andraschnik <luis.andraschnik en gmail.com>:

> Hola grupo!!
>
> Leí sobre el patrón de diseño Strategy, más allá de que puede ser
> implementado por funciones sin necesidad de recurrir a clases y que los
> patrones de diseño son lenguaje-dependientes, veo que en muchos textos
> indica que evita el uso de un largo if ..else if ...,
>
> No obstante no veo que se evite if ...else if ...  , salvo que se invoquen
> explícitamente las funciones. Por ejemplo :
>
> def leer_png(archivo):
>
>     print(''leí {} png".format(archivo))
>
> def leer_jpg():
>
>     print('leí {} jpg".format(archivo))
>
> def leer_pdf():
>
>     print('leí {} pdf".format(archivo))
>
>
> def imprimir(file, leer):
>
>     leer(file)
>
>
> Ejemplo de llamado explícito
>
> imprimir("archivo.pdf", leer_pdf)
>
> bárbaro pero muy poco util porque yo no sé de antemano que voy a leer,
> entonces redefino imprimir()
>
>
> def imprimir(archivo_cualquiera):
>
>     if archivo_cualquiera.endswith(".jpg"):
>
>         leer = leer_jpg
>
>     else if archivo_cualquiera.endswith(".png"):
>
>             leer=leer_png
>
>     else if archivo_cualquiera.endswith(".pdf"):
>
>             leer=leer_pdf
>
>     leer(archivo_cualquiera)
>
>
> y entonces dónde es que se evita el if ..else. Y si quiero leer 80
> formatos distintos???
>
>
> Sé que puede implementarse un diccionario de funciones, similar a una
> sentencia switch, pero no creo que se refieran a eso.
>
> Los ejemplos que leí siempre hacen un llamado explícito, pero en realida
> dlo que interesa es como seleccionar la función que se pasa como parámetro
> ...
>
> Me quedé pensando en esto y no le encuentro la solución o estoy
> interpretando algo mal.
>
> Saluti
>
> Luis
>
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a
> http://listas.python.org.ar/listinfo/pyar
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20180220/cb880899/attachment.html>


Más información sobre la lista de distribución pyar