ValueError: el tipo encaja, pero el valor concreto no
La función sabe trabajar con ese tipo de objeto, pero no con ese contenido o forma. Es el error típico de conversiones y validaciones donde el dato tiene el tipo general correcto.
El ejemplo clásico revela la diferencia
texto = "doce" numero = int(texto)
int() acepta strings, por eso no es un TypeError. El problema es que "doce" no representa un entero decimal que int() pueda interpretar.
Prueba una pequeña tabla de entradas
| Entrada | int(...) | Qué revela |
|---|---|---|
"42" | 42 | cadena válida como entero |
"4.2" | ValueError | representa decimal, no entero |
"hola" | ValueError | no representa número |
"" | ValueError | entrada vacía |
Validar antes o capturar después
Si solo necesitas convertir y reaccionar al fallo, try/except ValueError suele ser más fiable que intentar anticipar manualmente todas las formas de entrada. Si tienes reglas de dominio —por ejemplo edad entre 0 y 130— valida además el resultado convertido.
Otro origen: la forma del valor
nombre, edad = ["Ana"]
La lista es iterable y los tipos son válidos, pero tiene un número de elementos incompatible con la asignación. El mensaje específico te dice qué supuesto sobre el valor se rompió.
Referencia técnica: documentación oficial de excepciones de Python.