2010/2/9 lasizoillo <lasizoi...@gmail.com>: > El día 9 de febrero de 2010 18:38, Olemis Lang (Simelix) > <olemis...@gmail.com> escribió: >> 2010/2/9 lasizoillo <lasizoi...@gmail.com>: >>> El día 9 de febrero de 2010 15:52, Olemis Lang (Simelix) >>> <olemis...@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 _______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/