[pyar] Patrones de diseño: Strategy

Luis Andraschnik luis.andraschnik en gmail.com
Mie Feb 21 08:16:29 -03 2018


Hola Matías

Está muy bueno, pero eso es la magia de Python verdad, sino no es posible
evitar el if ..else ...(salvo con diccionarios) ?   No conocía el
diccionario locals() ni globals() gracias!!


Según la definición de getattr(*object*, *name*[, *default*]) :

Return the value of the named attribute of *object*. *name* must be a
string. If the string is the name of one of the object’s attributes, the
result is the value of that attribute. For example,* getattr(x, 'foobar')
is equivalent to x.foobar*. If the named attribute does not exist, *default*
is returned if provided, otherwise AttributeError
<https://docs.python.org/3/library/exceptions.html#AttributeError> is
raised.
¿Puedo hacer funcion = self.'leer_{}'.format(extension) ?

Saludos
Luis

El 20 de febrero de 2018, 17:02, Matías Bellone <matiasbellone en gmail.com>
escribió:

> 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
>>
>
>
> _______________________________________________
> 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/20180221/f75ffce9/attachment.html>


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