[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 18:38:58 CET 2010
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()
;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)
> Recuerda que estarías invocando a una función
> devuelta por un diccionario que puede estar definido muy lejos de
> donde se está usando.
>
Creo q hay que hacer una precisión, ahí no se estaría ejecutando una
función, sino un objeto código
>> ... verdad ? Si se da cuenta, utilizando funciones tendríamos q hacer
>> 4 que retornaran una tupla y se le asignaran a x y y. La otra cuestion
>> es la de los parámetros de esas funciones. Generalmente se necesitan
>> cosas en el namespace local para utilizarlas dentro del `switch` y
>> estas hay q pasarlas como parámetros. Claro, se pueden usar las
>> clausuras, pero reflexionemos todos los conceptos q se han mencionado
>> y cuan similares son a lo q nosotros pensamos cuando vamos a tomar uno
>> de varios caminos para tomar una decisión.
>>
>
> El código que se escribe se ha de leer muchas veces. En las
> revisiones, mejoras, correcciones de bugs, ... Prefiero un código que
> se tarda unos segundos más en escribirlo y se tarda varios minutos
> menos en leerlo. Prefiero que uno no se vea tentado a sacrificar esa
> legibilidad ni en los momentos de peor estrés.
>
Correcto, q es más legible, el código inline dentro del diccionario o
el exec (q debe funcionar y es real) con los `compile`s ?
Yo me voy por el primero ;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?
>>>
>>
>> No, de hecho no uso nada eso, todo lo programo con VIm sin colorcitos :P
>
> :sy on
>
Gracias, pero no lo uso a conciencia ;o)
>> Lo digo porq errores en el código se detectan al compilar hacia .PYC,
>> mientras que errores dentro de una cadena ejecutada con exec se
>> detectan al ejecutar la línea de código del exec (i.e. el hecho de q
>> compile no quiere decir q no está roto ;o). Además, si las
>> continuaciones son «perjudiciales como el goto», no creo q un exec sea
>> más beneficioso, considerando que rompe la secuencia precondición,
>> invariante, postcondición y las buenas prácticas de escritura del
>> código q plantearon Dijkstra, CAR Hoare et al. basados en modelos como
>> CSP, o luego DbC, ... Pero bueno, esa meta-tranca no la sigo para no
>> ponerme demasiado OT
>>
>
> La generación de bytecodes (ficheros .pyc) sólo detecta errores sintácticos.
>
es de lo q hablo
> 4c4-local:~ lasi$ python kk.py
> hola
> m4c4-local:~ lasi$ cat kk.py
> def kk():
> print variable_que_no_existe
>
> print "hola"
> m4c4-local:~ lasi$ pyflakes kk.py
> kk.py:2: undefined name 'variable_que_no_existe'
>
>
> Usar pyflakes o pylint es mejor ;-)
>
... pero eso no analiza las cadenas de los exec, eval & co. ¿o sí?
>>> 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
>>
>> Puede ser q ese sea el camino q otros quieran darle a la conversación,
>> yo solo quiero explorar y análizar las capacidades del lenguaje
>> tratando de estar lo menos prejuiciado posible por el hecho de q me
>> gusta, para así poder ser medianamente objetivo y 30% acertado, y
>> tener bien claro cómo es posible mejorarlo ;o)
>>
>
> Es objetivo que esa funcionalidad no está en el lenguaje.
+1
> Es subjetivo
> el hecho de que sea deseable.
+1 ... todo lo q digo parte de mi opinión personal.
> Yo personalmente no la deseo si el
> precio a pagar puede ser la perdida de legibilidad.
>
¿En q sentido se pierde la legibilidad?
--
Regards,
Olemis.
Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/
Featured article:
gmane.comp.version-control.subversion.trac.general -
http://feedproxy.google.com/~r/TracGViz-full/~3/SLY6s0RazcA/28067
Más información sobre la lista de distribución Python-es