Bienvenido a la Comunidad de Treehouse

¿Quieres colaborar en errores de código? ¿Tienes errores que necesitan comentarios? ¿Buscas un par de ojos adicionales en tu último proyecto? aquí.

¿Buscas aprender algo nuevo?

Treehouse ofrece una prueba gratuita de siete días para estudiantes nuevos. Obtén acceso a miles de horas de contenido y únete a miles de

Inicia tu prueba gratuita

Python Conceptos Básicos de Python Todo Junto Ahora Manejar Excepciones

"Literal inválido" al ingresar un carácter en una pregunta int

Cada vez que ingreso un carácter en la solicitud "cuántos boletos", obtengo este "literal inválido". ¿Alguna idea de qué estoy haciendo mal?

Script:

try:

Consola:

Por favor, ingresa tu nombre ruben
Hola ruben.
¿Cuántos boletos te gustaría? jk
¡Uh oh! Entrada inválida . literal inválido para int() con base 10: 'jk' Por favor, inténtalo de nuevo.
Hay 100 boletos disponibles

1 Respuesta

Asher Orr
sello-máscara
.a{fill-rule:evenodd;}techdegree seal-36
Asher Orr
Desarrollo en Python Graduado de Techdegree 9,411 Puntos

¡Hola Ruben! Estás viendo ese error por esta línea de código:

 tix_purchase = int(input("Hola {}.\n ¿Cuántos boletos te gustaría? ".format(name))) 

Específicamente esto:

int

Eso dice "¡Python, lo que mi usuario ingresa/introduce será un entero! Lanza un error si ingresa algo que no sea un entero."

Como "jk" es una cadena y no un entero, Python lanzó ese ValueError.

¿Tiene sentido?

PS- ¡consulta la hoja de trucos de markdown para ver ejemplos de sintaxis sobre cómo formatear tu publicación. ¡Hará que tu código sea más fácil de leer!

Hola Asher Orr , me encontré con un problema similar con el código siguiente:

    boletos = input(f¿Cuántos boletos te gustaría comprar, {first_name}? )

    try: 
        boletos = int(boletos)
        if boletos > tickets_remaining:
            raise ValueError(fLo sentimos, no nos quedan tantos boletos. Solo quedan {tickets_remaining} disponibles.)
    except ValueError como err:
        print(fParece que nos hemos encontrado con un error. {err} Por favor, inténtalo de nuevo.)

cuando intento dar una entrada de "hi" (por ejemplo) cuando me piden "¿Cuántos boletos...?", obtengo It looks like we've come across an error. invalid literal for int() with base 10: 'hi' Please try again.

Originalmente mi código era

    boletos = input(f¿Cuántos boletos te gustaría comprar, {first_name}? )

    try: 
        boletos = int(boletos)
        if boletos > tickets_remaining:
            raise ValueError(fLo sentimos, no nos quedan tantos boletos. Solo quedan {tickets_remaining} disponibles.)
    except ValueError como err:
        print(err)
        print(fParece que nos hemos encontrado con un error. Por favor, inténtalo de nuevo.)

Y vino con el mismo problema solo que dispuesto de manera diferente, así que vi el video... luego nunca se nos muestra otra ejecución donde se ingresa una cadena en esa solicitud.

¿Realmente se supone que debe salir de esa manera? Volví a ver el video y hicieron lo mismo con la variable "tickets"...

edit: Oh. Está bien, creo que lo entiendo. ¿Es porque necesito hacer otro bloque except, pero esta vez para un TypeError?

edit 2: Está bien, eso pareció funcionar cuando hice esto:

    boletos = input(f¿Cuántos boletos te gustaría comprar, {first_name}? )

    try: 
        boletos = boletos
        if boletos > tickets_remaining:
            raise ValueError(fLo sentimos, no nos quedan tantos boletos. Solo quedan {tickets_remaining} disponibles.)
    except ValueError como err:
        print(err)
        print(fParece que nos hemos encontrado con un error. Por favor, inténtalo de nuevo.)
    except TypeError:
        print(Por favor, inténtalo de nuevo y asegúrate de ingresar un número entero.) 

Mi pregunta es, sin embargo, ¿hay una forma más concisa de hacer esto 😬 A menos que me esté adelantando y esto se cubrirá en el siguiente video

Asher Orr
sello-máscara
.a{fill-rule:evenodd;}techdegree seal-36
Asher Orr
Desarrollo en Python Graduado de Techdegree 9,411 Puntos

Hola Tricia Cruz, excelente pregunta.

Deberías consultar this publicación en StackOverflow.

Un ValueError se lanza cuando una operación o función integrada recibe un argumento que tiene el tipo correcto pero un valor inapropiado.

Por otro lado, pasar argumentos del tipo incorrecto (por ejemplo, pasar una lista cuando se espera un int) debería resultar en un TypeError.

  boletos = input(f¿Cuántos boletos te gustaría comprar, {first_name}? )

    try: 
        boletos = boletos
        if boletos > tickets_remaining:
            raise ValueError(fLo sentimos, no nos quedan tantos boletos. Solo quedan {tickets_remaining} disponibles.)
    except ValueError como err:
        print(err)
        print(fParece que nos hemos encontrado con un error. Por favor, inténtalo de nuevo.)
    except TypeError:
        print(Por favor, inténtalo de nuevo y asegúrate de ingresar un número entero.) 

Puse el código anterior en mi IDE y obtuve un TypeError sin importar qué ingresara. Es por estas líneas:

 try: 
        boletos = boletos
        if boletos > tickets_remaining:

La segunda línea (en el código anterior) redefine la variable tickets para ser... ¡bueno, lo que era antes! Como "tickets" está definido por la entrada del usuario, será una cadena (la entrada del usuario siempre es una cadena).

Cuando el script llega a la siguiente línea (if tickets > tickets_remaining), lanza este error:

TypeError: '>' mantiene apoyado entre instancias debido 'str' y 'int'

Eso es porque tickets_remaining es un entero, pero tickets es una cadena.

Podrías hacer tu código más eficiente así:

user_selection = int(input(¿Cuántos boletos te gustaría comprar?)
    except ValueError:
        raise ValueError(Por favor, ingrese solo un número.)

Lo

Un ValueError se lanza cuando una operación o función integrada recibe un argumento que tiene el tipo correcto pero un valor inapropiado.

Cuando convertimos la entrada user_selection a un entero, Python verificará si es del tipo correcto. Verificará una cadena de texto, ya que la entrada del usuario siempre es una cadena de texto. Luego verifica un valor apropiado: una cadena de texto que se pueda convertir en un entero (como "8").

Python considerará cualquier cadena de texto que no sea un número como un valor inapropiado. Por lo tanto, lanzará un ValueError. Puede simplificar el manejo de errores de esa manera.

¿Responde esto su pregunta?

¡Sí, muchas gracias!