Foros del Web » Programando para Internet » Python »

Switch-Case - Solución para múltiples IF

Estas en el tema de Switch-Case - Solución para múltiples IF en el foro de Python en Foros del Web. Buenas, vengo leyendo que Python no tiene el típico "EN CASO DE ...." el IF Case o Switch Case, como lo quieran llamar y que ...
  #1 (permalink)  
Antiguo 13/01/2013, 08:27
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Switch-Case - Solución para múltiples IF

Buenas, vengo leyendo que Python no tiene el típico "EN CASO DE ...." el IF Case o Switch Case, como lo quieran llamar y que muchos programadores critican con dureza que Python carezca de una herramienta tan estándar en el mundo de la programación.

Ejemplo: http://bytebaker.com/2008/11/03/swit...ent-in-python/ hay un usuario que plantea un caso de IF CASE realmente difícil de resolver con Python.

Para un caso puntual lo resuelvo con simples IF:

de acuerdo una variable numérica activo el radio button correspondiente :

Código:
        #Selecciono el Radio Button activo de acuerdo al Usuario activo leído previamente
        if usuarioactivonumero == 1 : radio1.SetValue(1)
        if usuarioactivonumero == 2 : radio2.SetValue(1)
        if usuarioactivonumero == 3 : radio3.SetValue(1)
        if usuarioactivonumero == 4 : radio4.SetValue(1)
        if usuarioactivonumero == 5 : radio5.SetValue(1)
Pero si tuviera 50 posibilidades por ejemplo sería poco estético tener 50 líneas, aunque de última lo hago y se que funciona

Leí que se suele suplir el Switch Case por diccionarios o con funciones lambda...

supongo que en mi caso sería algo del estilo:

Código:
opciones = {1 : radio1.SetValue(1), 2 : radio2.SetValue(1), 3 : radio3.SetValue(1), 4 : radio4.SetValue(1), 5 : radio5.SetValue(1)}
lo que no me doy cuenta es de como llamar luego a la acción adecuada

  #2 (permalink)  
Antiguo 13/01/2013, 19:47
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Switch-Case - Solución para múltiples IF

Código Python:
Ver original
  1. opcion = 2
  2. opciones = {
  3.     1 : radio1.SetValue,
  4.     2 : radio2.SetValue,
  5.     3 : radio3.SetValue,
  6.     4 : radio4.SetValue,
  7.     5 : radio5.SetValue
  8. }
  9. radio = opciones.get(opcion)
  10. if radio:
  11.     radio(1)

Última edición por razpeitia; 13/01/2013 a las 19:52 Razón: corrección
  #3 (permalink)  
Antiguo 13/01/2013, 19:50
Avatar de gildus  
Fecha de Ingreso: agosto-2003
Mensajes: 1.495
Antigüedad: 20 años, 8 meses
Puntos: 105
Respuesta: Switch-Case - Solución para múltiples IF

Holas,

No seria:

Código Python:
Ver original
  1. ...
  2. radio = opciones.get(opcion)
  3. ...

Saludos
__________________
.: Gildus :.
  #4 (permalink)  
Antiguo 14/01/2013, 08:18
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Switch-Case - Solución para múltiples IF

El problema principal de switch es de mantenimiento, y de hecho el ejemplo que presenta el usuario (el mismo que sería difícil de representar con diccionarios) es al mismo tiempo perfecto ejemplo de eso. Copio el código aquí por si algún día desaparece el artículo enlazado.

Código C:
Ver original
  1. switch(n) {
  2.     case 0:
  3.         printf("You typed zero.\n");
  4.         break;
  5.     case 1:
  6.     case 9:
  7.         printf("n is a perfect square\n");
  8.         break;
  9.     case 2:
  10.         printf("n is an even number\n");
  11.     case 3:
  12.         printf("n is this");
  13.     case 5:
  14.         printf("n is also this");
  15.     case 7:
  16.         printf("n is too complex for silly python hacks")
  17.         printf("n is a prime number\n");
  18.         break;
  19.     case 4:
  20.         printf("n is a perfect square\n");
  21.     case 6:
  22.     case 8:
  23.         printf("n is an even number\n");
  24.         break;
  25.     default:
  26.         printf("Only single-digit numbers are allowed\n");
  27.         break;
  28. }

Obsérvalo bien. Intenta comprender todo lo que sucede para cada dígito, y luego imagínate intentando hacer una modificación simple como agregar una opción faltante, agregar código para alguna de las opciones.
Dinos si no te parece que deberías tener bastante cuidado. Este switch está perfectamente adaptado a este caso (e incluso así, tiene código repetido), y en cualquier modificación habrá que reescribirlo.

Switch no es malo, es bastante útil. Python no lo incluye, y honestamente creo que no lo necesita: perfectamente se puede acomodar la lógica del programa para que funcione de forma equivalente, aunque no sea equivalente en el código.

Por ejemplo, en tu caso con los usuarios y los radio, yo haría una modificación al momento de generar los radioN:

Código Python:
Ver original
  1. for u in usuarios:
  2.     radios[u.numero] = ...
y luego
Código Python:
Ver original
  1. radios[usuarioactivonumero].SetValue(1)


Saludos.

Última edición por AlvaroG; 14/01/2013 a las 08:23
  #5 (permalink)  
Antiguo 14/01/2013, 12:07
 
Fecha de Ingreso: enero-2013
Ubicación: 127.0.0.1
Mensajes: 16
Antigüedad: 11 años, 3 meses
Puntos: 6
Respuesta: Switch-Case - Solución para múltiples IF

Soy programador Python y de verdad no he necesitado el Switch-Case, ya que esa sentencia prácticamente "hace" una función que en Python se puede hacer de varias maneras, entonces seria mucha redundancia.

Ahora, lo recomendable es usar diccionarios ya que te permite crear claves alfanuméricas; Por ejemplo:

Código Python:
Ver original
  1. ...
  2. menu = {"salir": objeto.salir,
  3.         "ingresar": objeto.ingresar,
  4.         "borrar": objeto.borrar}
  5.  
  6. menu[opcion]()

Así puedes tener métodos como opciones y te ahorras tener que escribir código dentro de case que puede volverse extenso.

Saludos!
  #6 (permalink)  
Antiguo 15/01/2013, 04:31
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: Switch-Case - Solución para múltiples IF

Cita:
Iniciado por AlvaroG Ver Mensaje

Obsérvalo bien. Intenta comprender todo lo que sucede para cada dígito, y luego imagínate intentando hacer una modificación simple como agregar una opción faltante, agregar código para alguna de las opciones.
Dinos si no te parece que deberías tener bastante cuidado. Este switch está perfectamente adaptado a este caso (e incluso así, tiene código repetido), y en cualquier modificación habrá que reescribirlo.

Switch no es malo, es bastante útil. Python no lo incluye, y honestamente creo que no lo necesita: perfectamente se puede acomodar la lógica del programa para que funcione de forma equivalente, aunque no sea equivalente en el código.

Por ejemplo, en tu caso con los usuarios y los radio, yo haría una modificación al momento de generar los radioN:.
Muchas gracias Alvaro!

Realmente el ejemplo del cual pegué el enlace lo puse más que nada por la discusión que había al respecto de la carencia del IF CASE en Python. El ejemplo en sí es demasiado complejo tal como mencionas.

Mi situación es mucho más sencilla porque mi caso es totalmente lineal. Si mi programa crece en lugar de tener radios button del 1 al 5 tendré del 1 al 10, etc... o sea, aunque lo resuelva manualmente tal como hice hasta ahora si el programa crece copio y pego unas líneas, cambio unos números y listo.

Pero justamente buscaba una solución más "pythoniana" y la tuya y la de otros compañeros del foro son mucho más agradables.

Gracias!
  #7 (permalink)  
Antiguo 15/01/2013, 04:34
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: Switch-Case - Solución para múltiples IF

Cita:
Iniciado por razpeitia Ver Mensaje
Código Python:
Ver original
  1. opcion = 2
  2. opciones = {
  3.     1 : radio1.SetValue,
  4.     2 : radio2.SetValue,
  5.     3 : radio3.SetValue,
  6.     4 : radio4.SetValue,
  7.     5 : radio5.SetValue
  8. }
  9. radio = opciones.get(opcion)
  10. if radio:
  11.     radio(1)
No entiendo las últimas dos líneas,

if radio:
radio(1)

radio(1) ??? no debería ser radio(algo variable) ??? o simplemente omites el resto de los if para simplificar ?? o sea, dónde están el radio(2), radio(3) etc...
  #8 (permalink)  
Antiguo 15/01/2013, 04:35
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: Switch-Case - Solución para múltiples IF

Cita:
Iniciado por yograterol Ver Mensaje

Así puedes tener métodos como opciones y te ahorras tener que escribir código dentro de case que puede volverse extenso.

Saludos!

Genial, muchas gracias, en esa forma es mucho más fácil escalar el programa!
  #9 (permalink)  
Antiguo 15/01/2013, 06:59
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Switch-Case - Solución para múltiples IF

Cita:
Iniciado por tecafede Ver Mensaje
No entiendo las últimas dos líneas,

if radio:
radio(1)

radio(1) ??? no debería ser radio(algo variable) ??? o simplemente omites el resto de los if para simplificar ?? o sea, dónde están el radio(2), radio(3) etc...
Vale recordar que en Python se puede asignar funciones a variables, como en otros lenguajes pero no en todos :)

Con el código de la línea 9, obtendrás el valor de opciones[opcion], o None si la clave opcion no existe en el diccionario.
Con el if, evitas continuar si el valor es None. Si la clave efectivamente existía, radio obtiene el valor radioN.SetValue, por lo que la última llamada a radio(1) es radioN.SetValue(1).


Saludos.
  #10 (permalink)  
Antiguo 15/01/2013, 11:15
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: Switch-Case - Solución para múltiples IF

Cita:
Iniciado por AlvaroG Ver Mensaje
Vale recordar que en Python se puede asignar funciones a variables, como en otros lenguajes pero no en todos :)

Con el código de la línea 9, obtendrás el valor de opciones[opcion], o None si la clave opcion no existe en el diccionario.
Con el if, evitas continuar si el valor es None. Si la clave efectivamente existía, radio obtiene el valor radioN.SetValue, por lo que la última llamada a radio(1) es radioN.SetValue(1).


Saludos.
Perfecto Alvaro, muchas gracias por la aclaración, no me di cuenta que era un "check if it is true".

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:54.