[Python-es] Análisis sobre Python vs ruby WAS: Python y/o ruby para no programadores
Olemis Lang (Simelix)
olemis+py en gmail.com
Mar Feb 9 21:23:01 CET 2010
2010/2/9 lasizoillo <lasizoillo en gmail.com>:
> El día 9 de febrero de 2010 18:38, Olemis Lang (Simelix)
> <olemis+py en gmail.com> escribió:
>> 2010/2/9 lasizoillo <lasizoillo en gmail.com>:
>>> El día 9 de febrero de 2010 15:52, Olemis Lang (Simelix)
>>> <olemis+py en gmail.com> escribió:
>>>>
>>>>>> - 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
>>>>>
>>>>
>>>> Ok, lo cual sería mucho más legible que algo como (en un Python
>>>> Rubizadoribilistizado ;o)
>>>>
>>
>> Realmente debería lucir mejor así
>>
>> {
>> 'k' : do
>> x = 1; y = 2
>> end,
>> 'w' : do
>> x = 3; y = 4
>> end,
>> 'g' : do
>> x = 5; y = 6
>> end,
>> 'xxx' : do
>> x = 7; y = 8
>> end,
>> }[variable].execute()
>
> Eso debería pintar así
>
> if variable=='k':
> x=1
> y=2
> elif variable=='w':
> x=3
> y=4
> elif variable=='g':
> x=5
> y=6
> elif variable=='xxx':
> x=7
> y=8
>
Esto es curioso, evidentemente q sé esto. Solo q utilisé un ejemplo
sencillo para ilustrar un case con bloques inline. Bueno échenle un
vistazo a las referencias en el otro hilo para q comprendan por q el
caso del switch con diccionarios, y porq lo recomiendan (hasta en la
FAQ de Py). Por tal razón no es algo q continuaré discutiendo (falta
de tiempo ;o), al menos hasta q no lo sugieran en la FAQ q es
contraproducente ;o)
> Normalmente, usar un diccionario como dispatcher se suele usar cuando
> la llamada y la definición del diccionario no estan juntas.
No es lo q sugiere la FAQ ;o)
> Dos
> ejemplos practicos te los puse en el anterior correo:
>
> * Versión pythonica: http://github.com/breily/juno
> * Versión ruby: http://github.com/bmizerany/sinatra
>
> En ambos crean una descripción de enrutado que enlazan a un bloque de
> código (con función encapsulando el bloque de codigo en el caso de
> python). Como te dije, para ese caso concreto, ruby si que me parece
> más legible y el uso de un diccionario para hacer un switch apropiado.
> Como construcción normal del lenguaje me parece incorrecto.
>
> Aunque si somos precisos ambos se registran en una lista en vez de un
> diccionario, porque varios paths de urls pueden disparar un mismo
> bloque de código. Pero esto son detalles de implementación que no
> vienen al caso.
>
Lo siento pero casi no tengo tiempo para revisar cosas nuevas, a muy
pesar mío. Quizás algún día le eche un vistazo
;o)
>>> Si viera un código que utilizara eso me cortaria las venas. De pronto
>>> me encontraria sorprendido de que me aparezan mágicamente las
>>> variables x e y.
>>
>> Es la misma magia q ocurre si se ejecuta
>>
>> exec(
>> {
>> 'k' : compile('x = 1; y = 2'),
>> 'w' : compile('x = 3; y = 4'),
>> 'g' : compile('x = 5; y = 6'),
>> 'xxx' : compile('x = 7; y = 8')
>> }[variable])
>>
>> lo q con la ventaja adicional del chequeo de sintaxis, y ser más
>> legible (IMO ;o)
>
> De todas formas, recuerda que es una posibilidad disponible, no algo
> recomendable ;-)
>
> El if/elif/else es lo más recomendable para hacer algo parecido a un
> switch. Para hacer un dispatcher se puede permitir cierta magia
> siempre que todo quede documentado :-)
>
Entonces ya no es tan mágico
;o)
--
Regards,
Olemis.
Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/
Featured article:
Embedding pages? - Trac Users | Google Groups -
http://feedproxy.google.com/~r/TracGViz-full/~3/-XtS7h-wjcI/e4cf16474aa3cb87
Más información sobre la lista de distribución Python-es