Una especie de “switch” en Python
Escrito por jorgicio en Informática, Linux y Software libre
De ocioso, conversando con Mario en una de las tantas charlas por Google Talk (en realidad por Pidgin xD), estuvimos hablando de sentencias de flujo, cómo programar bien en PHP, etc. De repente, por esas cosas de la vida, me acordé que Python NO tiene implementada por defecto una sentencia de control de flujo del tipo switch-case. Pero en este link, descubrí que sí se puede crear una por medio de diccionarios y una función y/u opción predefinida.
Una versión emulada de una sentencia “switch-case” vendría siendo del tipo:
def funcionalgo(parametroalgo,otroparametro,etc...):
#aca va lo que hace una funcion, googlea para mas informacion
return algo # por si queris que retorne alguna wea xd
def otrafuncion(asdasdas...):
#...aca igual deberia hacer algo xd
...
...
...
#Ahora definimos un diccionario llamado "case":
case = {
'un caso': funcionalgo, #llama a funcion algo
'otro caso': otrafuncion, #llama a otra funcion
...
...
...
'default': hacelaweapordefaultxd
}
opcion1 = 'un caso'
case[opcion1](parametrodelafuncionalgo,...) #depende de los parametros de la funcion
case[opcion2](parametrodeotrafuncion,...)
¿Se entendió con este pseudocódigo? Me imaginé que no o no mucho. Bueno, pondré un ejemplo para que entiendan:
def maulla(nombreneko):
return "el gatito %s dice meow ~"%nombreneko
def dinosaurio(nombredinosaurio):
return "%s dice: RAWR!!"%nombredinosaurio
case = {
'meow': maulla,
'rawr': dinosaurio
}
print case['meow']("misifu")
#Otra forma de trabajar un diccionario
dainosor = 'rawr'
print case[dainosor]("denver")
De esta manera por fin tendré que ahorrarme la paja de andar haciendo reiterados “if, elif, elif,…,else” cuando tenga que trabajar con múltiples opciones D:
Espero que les sirva.
Jorgicio






















Entradas (RSS)
El único problema de tu código, es que si el valor de la variable dainosor no existe, se produce una excepción y tu programa falla, ya que el caso ‘default’ es con el valor de un string “default” no para cuando no hay nada.
Tendría que ser algo asi:
In [1]: def fun1(lala):
…: print “fun1: %s” % str(lala)
…:
In [2]: def fun2(lala):
…: print “fun2: %s” % str(lala)
…:
In [3]: def fun3(lala):
…: print “fun3: %s” % str(lala)
…:
In [4]: case={‘uno’: fun1, ‘dos’: fun2}
In [5]: case.get(‘uno’,fun3)(“hola mundo”)
fun1: hola mundo
In [6]: case.get(‘dos’,fun3)(“hola mundo”)
fun2: hola mundo
In [7]: case.get(‘tres’,fun3)(“hola mundo”)
fun3: hola mundo
In [8]: case.get(‘no existe’,fun3)(“hola mundo”)
fun3: hola mundo
Viste la diferencia?
Renato: acuérdate que en los lenguajes de scripting como Python, Perl, PHP, etc., no siempre necesitai declarar variables, de hecho, Python no se hace drama si asigno “dainosor” en un ámbito random a menos que la defina después de ser citada, ahí sí que se cae el mundo xD
Ahora, con respecto al default, era un supuesto, se supone que es una función predefinida o si quieres que no haga nada, simplemente pones “pass”.
Además igual tiene error pero NO por lo que dijiste, sino que porque escribí mal la variable “dainosaur” en el hash cuando lo llamé xP
Sería n.n
Saludillos :B
El problema es que la version con if/elif queda harto mas clara (y de hecho me parece que es mas corta).
Cuando si he encontrado util este truco es cuando el if/elif es de la forma:
if x == ‘foo’
y = ‘1′
elif x == ‘bar’
y = ‘2′
elif x == ‘baz’
y = ‘3′
En cuyo caso prefiero:
y = {‘foo’: ‘1′, ‘bar’: ‘2′, ‘baz’: ‘3′}[x]