A veces, un experimento mental puede resultar útil.
- Comportamiento A:
int('1.23')falla con un error. Este es el comportamiento existente.
- Comportamiento B:
int('1.23')produce 1sin error. Esto es lo que propones.
Con el comportamiento A, es sencillo y trivial obtener el efecto del comportamiento B: utilícelo int(float('1.23'))en su lugar.
Por otro lado, con el comportamiento B, obtener el efecto del comportamiento A es significativamente más complicado:
def parse_pure_int(s):
if "." in s:
raise ValueError("invalid literal for integer with base 10: " + s)
return int(s)
(e incluso con el código anterior, no tengo total confianza en que no hay un caso de esquina que se maneje mal).
Por tanto, el comportamiento A es más expresivo que el comportamiento B.
Otra cosa a considerar: '1.23'es una representación de cadena de un valor de punto flotante. Conversión '1.23'a un número entero conceptualmente implica dos conversiones (cadena a flotante a un entero), pero int(1.23)y int('1')cada implican sólo una conversión.
Editar:
Y de hecho, hay casos extremos que el código anterior no manejaría: 1e-2y 1E-2ambos son valores de punto flotante también.
type(3)devuelve<type int>. Sin embargo, Python no se quejafloat("3"). ¿Python no está convirtiendo implícitamente la cadena en un int y luego en un flotante?