Foros del Web » Programando para Internet » Python »

¿Evitar que un código se interrumpa por un dato incorrecto?

Estas en el tema de ¿Evitar que un código se interrumpa por un dato incorrecto? en el foro de Python en Foros del Web. Una de las cosas que me gustaría aprender desde el principio, es, que si una función nos pide un argumento y nosotros le introducimos un ...
  #1 (permalink)  
Antiguo 27/05/2014, 12:58
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
¿Evitar que un código se interrumpa por un dato incorrecto?

Una de las cosas que me gustaría aprender desde el principio, es, que si una función nos pide un argumento y nosotros le introducimos un dato por error (o por que nos da la gana) el código no se interrumpa y nos muestre una advertencia. Luego, claro esta, nos permita la oportunidad de hacerlo de nuevo correctamente.

Estoy con un curso donde se define una función donde nos pide la temperatura del agua. Nos muestra entonces el estado del liquido.

Código Python:
Ver original
  1. def estado_agua(num):
  2.     if (type(num) == int) or (type(num) == float):
  3.         if (num <= 0):
  4.             return ('La temperatura es '+str(num)+' grados. Su estado es solido.')
  5.         elif (num > 0) and (num <= 100):
  6.             return ('La temperatura es '+str(num)+' grados. Su estado es liquido.')
  7.         elif (num > 100):
  8.             return ('La temperatura es '+str(num)+' grados. Su estado es gaseoso.')
  9.     else:
  10.         print('Valor incorrecto')

Esta primera linea
Código Python:
Ver original
  1. if (type(num) == int) or (type(num) == float):

nos permite entrar en el siguiente IF si introducimos datos int o float. Si no lo hacemos (ponemos un string o bool) nos devuelve el else. Osea, funcionaría bien.

Pero si ponemos:

estado_agua()

ó

estado_agua(var) # Cualquier palabra sin comillas.

Nos devuelve un error. No se ejecuta el else

¿Cómo hacemos en esos casos?
  #2 (permalink)  
Antiguo 27/05/2014, 13:56
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Evitar que un código se interrumpa por un dato incorrecto?

Hola, no entiendo bien tu pregunta, vos decís que al preguntarte el programa por un valor vos le escribís esto y te da error:

estado_agua()

es esa la pregunta?
  #3 (permalink)  
Antiguo 27/05/2014, 14:18
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: ¿Evitar que un código se interrumpa por un dato incorrecto?

El modo correcto es lanzar una excepcion que luego podria ser capturada a nivel de invocacion de estado_agua() o a nivel superior:

Código Python:
Ver original
  1. def estado_agua(num):
  2.     if (type(num) != int) and (type(num) != float):
  3.         raise Exception("Tipo de dato esperado es no-numerico!")
  4.  
  5.    
  6.     if (num<-273):
  7.         raise Exception("En el Universo no hay nada por debajo de -273 C")
  8.     elif (num<=0):     
  9.         return ('La temperatura es '+str(num)+' grados. Su estado es solido.')
  10.     elif (num > 0) and (num <= 100):
  11.         return ('La temperatura es '+str(num)+' grados. Su estado es liquido.')
  12.     elif (num > 100):
  13.         return ('La temperatura es '+str(num)+' grados. Su estado es gaseoso.')
  14.    
  15. print(estado_agua(-200));
  16. print(estado_agua(0));
  17. print(estado_agua(10));
  18. print(estado_agua(104));
  19. # ta tan...
  20. print(estado_agua(-300));

Ya si lo que quieres es evitar errores deberias:

- Hacer casting a numero
- Usar parametros opcionales, si no te dan el estado asumes 0 por ejemplo
__________________
Salu2!
  #4 (permalink)  
Antiguo 27/05/2014, 14:36
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Evitar que un código se interrumpa por un dato incorrecto?

Koan aquí tenés un código correcto:

Código Python:
Ver original
  1. def estado_agua(num):
  2.     if (num.isdigit()) or num[:1] == "-" and num[1:].isdigit():
  3.         Num = int(num)
  4.         if (Num <= 0):
  5.             return ('La temperatura es %d grados. Su estado es solido.' % Num)
  6.         elif (Num > 0) and (Num <= 100):
  7.             return ('La temperatura es %d grados. Su estado es liquido.' % Num)
  8.         elif (Num > 100):
  9.             return ('La temperatura es %d grados. Su estado es gaseoso.' % Num)
  10.     else:
  11.         return ('Valor incorrecto')
  12.  
  13. valor = raw_input()
  14.  
  15. print estado_agua(valor)
  16.  
  17. raw_input()

El tuyo tiene varios errores.
Por ejemplo este:

return ('La temperatura es '+str(num)+' grados. Su estado es solido.'

Debés evitar concatenar cadenas, además si el valor es un int, tratalo como tal.

Buena suerte!!
  #5 (permalink)  
Antiguo 27/05/2014, 14:45
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: ¿Evitar que un código se interrumpa por un dato incorrecto?

Notaras que con "muy fria" vas muerto...... esta es mas a tu gusto creo:

Código Python:
Ver original
  1. def estado_agua(num=None):   
  2.     if (num==None):
  3.         num=0
  4.  
  5.     if (isinstance(num, str)):
  6.         try:
  7.             num = float(num)
  8.         except ValueError:  
  9.             return ("Tipo de dato esperado es no-numerico!")
  10.  
  11.     if (num<-273):
  12.         return ("En el Universo no hay nada por debajo de -273 C")
  13.     elif (num<=0):     
  14.         return ('La temperatura es '+str(num)+' grados. Su estado es solido.')
  15.     elif (num > 0) and (num <= 100):
  16.         return ('La temperatura es '+str(num)+' grados. Su estado es liquido.')
  17.     elif (num > 100):
  18.         return ('La temperatura es '+str(num)+' grados. Su estado es gaseoso.')
  19.  
  20. print(estado_agua());    # ok
  21. print(estado_agua(-200)); # ok
  22. print(estado_agua(0)); # ok
  23. print(estado_agua(10)); # ok
  24. print(estado_agua(104)); # ok
  25. # pasa como numero
  26. #print(estado_agua('20'));
  27. print(estado_agua(-300));
  28.  
  29. # ta tan...
  30. print(estado_agua('muy fria!'));

y no lanzo excepciones.... cosa que a mi me gusta pero creo que a vos no


@Principe_Azul : esto no es una "competencia" pero fijate que pasa si a tu funcion le envias los mismos datos que a esta ultima version... veras que explota sin parametros, con numeros negativos.......etc etc
__________________
Salu2!
  #6 (permalink)  
Antiguo 28/05/2014, 12:14
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: ¿Evitar que un código se interrumpa por un dato incorrecto?

Ok. Gracias a los dos por los códigos. Aunque en ellos hay cosas que todavía no he aprendido. Por ejemplo el uso de excepciones.

Saludos!
  #7 (permalink)  
Antiguo 30/05/2014, 13:55
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Evitar que un código se interrumpa por un dato incorrecto?

Cita:
@Principe_Azul : esto no es una "competencia" pero fijate que pasa si a tu funcion le envias los mismos datos que a esta ultima version... veras que explota sin parametros, con numeros negativos.......etc etc
Me parece que no has probado mi programa, el mismo funciona perfectamente.

Nadie habló de competencia, cuando dije esto:

El tuyo tiene varios errores.
Por ejemplo este:

return ('La temperatura es '+str(num)+' grados. Su estado es solido.'

Debés evitar concatenar cadenas, además si el valor es un int, tratalo como tal.


me estaba refiriendo al usuario Koan, porque eso de concatenar no es buena práctica y si un tipo de valor es int, hay que tratarlo como tal, así se aprende.
Ah y otra cosa, las funciones no explotan, no son bombas, en todo caso no funcionan.
  #8 (permalink)  
Antiguo 30/05/2014, 14:38
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: ¿Evitar que un código se interrumpa por un dato incorrecto?

@Principe_Azul : tienes razon... tranqui capo solo decia que probaras otras "condiciones" y ver si tu programa las considera:

print(estado_agua()); # ok
print(estado_agua(-200)); # ok
print(estado_agua(0)); # ok
print(estado_agua(10)); # ok
print(estado_agua(104)); # ok
print(estado_agua('20'));
print(estado_agua(-300));
print(estado_agua('muy fria!'));
__________________
Salu2!
  #9 (permalink)  
Antiguo 30/05/2014, 15:45
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Evitar que un código se interrumpa por un dato incorrecto?

Por favor mi amigo Italico, todo más que bien, todos somos compañeros!!! y nos ayudamos!!

Pero amigo yo lo probé al código y funciona bien, pero cuando una persona escribe por ejemplo números negativos, no tiene problema el programa, creo que no es necesario el crear varias varias llamadas a la misma función si sólo lo puedes probar de una manera más simple, igual se puede hacer algo recursivo o un bucle si se necesitara llamar varias veces a la misma función.

¡Un saludo!

Etiquetas: dato, gui, ip
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:31.