[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