[Python-es] Python y/o ruby para no programadores

lasizoillo lasizoillo en gmail.com
Mar Feb 9 14:50:45 CET 2010


El día 9 de febrero de 2010 14:09, Olemis Lang (Simelix)
<olemis+py en gmail.com> escribió:
> Solo una precisión ;o)
>
> 2010/2/8 Chema Cortes <pych3m4 en gmail.com>:
>> El día 8 de febrero de 2010 16:39, Olemis Lang (Simelix)
>> <olemis+py en gmail.com> escribió:
>>
>>> pero los bloques de código de Ruby son muy cómodos y potentes (y no
>>> hay nada como eso en Python)
>>
>> Cómodos sí, pero no diría tanto como que no hay nada en python. En
>> python puedes hacer casi lo mismo con iterables, con la posibilidad de
>> usar la sencillez de la comprensión de listas para manejarlos (compara
>> código anidando bloques de código, por ejemplo).
>>
>
> No creo estar completamente de acuerdo. Hay varias cuestiones entre
> ambos enfoques q creo q hay que destacar :
>
>  - Si el tema es sobre el uso de bloques con `each` entonces esto
>     es completamente corecto
>  - Pero los bloques no se limitan necesariamente a eso.
>     - Por ejemplo,
>       en el caso de IO asíncrona muy frecuentemente se utilizan
>       callbacks. En Python la única solución es escribir una
>       función o «clase invocable» (i.e. callable) y pasarla como parámetro
>       a alguna función o mecanismo de registro q tenga la API.
>       Esto puede ser engorroso. En Ruby los casos sencillos pueden
>       ser descritos con un bloque de código inline y queda más legible
>       y menos «verbose» (más conciso).

#Asi a ojo y sin probar

def block(code):
   def inner():
       exec code
   return inner

cosa_asincrona.register(block("print 'no es para tanto'"))
otra_cosa.register(block("""
    for i in range(10):
        print 'no volvere a copiar en clase'
"""))

No lo he probado porque soy feliz definiendo funciones para las
llamadas asincronas. Hay no, perdona, que tambien puedes consumir las
llamadas asincronas con coroutinas:
http://blog.mekk.waw.pl/archives/14-Twisted-inlineCallbacks-and-deferredGenerator.html

>    - Otro ejemplo, la solución al `case` o `switch` de Python basada en dict(s)
>      implica q a cada llave se le asigne algo q, al ejecutarlo, se realiza lo
>      q sea específico de esa alternativa. Pasa algo más o menos semejante,
>      en Python resulta engorroso escribir una función para cada alternativa,
>      sin el propósito de reutilizarla (sino solo para suplir una carencia del
>      lenguaje) y la legibilidad es pésima, porq todo está separado y
>      disperso y con un vistazo no se puede tener idea de lo
>      q pasa. Con bloques inline como los de Ruby se podría mejorar esto.
>

Si el if/elif/else no te vale, igual si que deberias considerar usar
funciones separadas :-O


> Claro, q en todos estos casos se pudiera utilizar un objeto de typo
> `code`, la función `compile`, o `exec`, pero el efecto no es el mismo
> ... IMO

¿Por el coloreado de sintaxis en el editor?

Creo que esto se empieza a perecer a una lucha dialectica entre si la
tortilla de patata está más buena con cebolla o sin ella :-P



Más información sobre la lista de distribución Python-es