Suponiendo lo siguiente:
>>> square = '²' # Superscript Two (Unicode U+00B2) >>> cube = '³' # Superscript Three (Unicode U+00B3)Curiosamente:
>>> square.isdigit() True >>> cube.isdigit() TrueOK, vamos a convertir esos "dígitos" a enteros:
>>> int(square) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '²' >>> int(cube) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '³'¡Ups!
¿Alguien podría explicar qué comportamiento debo esperar del método str.isdigit() al manejar cadenas?
str.isdigit no pretende estar relacionado con la capacidad de análisis como int . Está informando una propiedad Unicode simple, es un carácter decimal o un dígito de algún tipo:
str.isdigit()Devuelve
Truesi todos los caracteres de la cadena son dígitos y hay al menos un carácter,Falseen caso contrario. Los dígitos incluyen caracteres decimales y dígitos que necesitan un tratamiento especial, como los dígitos en superíndice de compatibilidad. Esto cubre dígitos que no se pueden usar para formar números en base 10, como los números de Kharosthi. Formalmente, un dígito es un carácter que tiene el valor de propiedad Numeric_Type=Digit o Numeric_Type=Decimal.
En resumen, str.isdigit es completamente inútil para detectar números válidos. La solución correcta para verificar si una cadena dada es un entero legal es llamar a int y capturar el ValueError si no es un entero legal. Cualquier otra cosa que haga será (mal) reinventar las mismas pruebas que realiza el código de análisis real en int() , entonces, ¿por qué no dejar que haga el trabajo en primer lugar?
Nota al margen: está utilizando el término "utf-8" incorrectamente. UTF-8 es una forma específica de codificar Unicode y solo se aplica a datos binarios sin procesar. El str de Python es un tipo de texto Unicode "idealizado"; no tiene codificación (debajo del capó, se almacena codificado como uno de ASCII, latin-1, UCS-2, UCS-4 y posiblemente también UTF-8, pero nada de eso es visible en la capa de Python fuera de las mediciones indirectas como sys.getsizeof , que solo sugiere la codificación subyacente al permitirle ver cuánta memoria consume la cadena). Los caracteres de los que está hablando son caracteres Unicode simples por encima del rango ASCII, no son específicamente UTF-8.