¿Cómo comprobar si una variable es un entero o una cadena? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Tengo una aplicación que tiene un par de comandos. Cuando escribe un comando determinado, debe escribir información adicional sobre algo / alguien. Ahora esa información tiene que ser estrictamente un entero o una cadena, dependiendo de la situación.

Sin embargo, cualquier cosa que escribas en Python usando raw_input() en realidad es una cadena, no importa qué, así que más específicamente, cómo lo haría en breve y sin intentarlo...excepto ver si una variable está hecha de dígitos o caracteres?

Author: bernie, 2013-05-10

5 answers

En mi opinión tienes dos opciones: {[17]]}

  • Solo intenta convertirlo en un int, pero captura la excepción:

    try:
        value = int(value)
    except ValueError:
        pass  # it was a string, not an int.
    

    Este es el enfoque de Pedir Perdón.

  • Prueba explícitamente si solo hay dígitos en la cadena:

    value.isdigit()
    

    str.isdigit() devuelve True sólo si todos los caracteres de la cadena son dígitos (0-9).

    El equivalente de tipo unicode / Python 3 str es unicode.isdecimal() / str.isdecimal(); solo Unicode los decimales se pueden convertir en enteros, ya que no todos los dígitos tienen un valor entero real (U+00B2 El SUPERÍNDICE 2 es un dígito, pero no un decimal, por ejemplo).

    Esto a menudo se llama el enfoque Pedir Permiso, o Mirar Antes de Saltar.

Este último no detectará todos los valores int() válidos, ya que los espacios en blanco y + y - también se permiten en los valores int(). La primera forma aceptará felizmente ' +10 ' como un número, la segunda no lo hará.

Si su espere que el usuario normalmente ingrese un entero, use la primera forma. Es más fácil (y más rápido) pedir perdón en lugar de pedir permiso en ese caso.

 56
Author: Martijn Pieters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-10 08:54:13

Si quieres comprobar lo que es:

>>>isinstance(1,str)
False
>>>isinstance('stuff',str)
True
>>>isinstance(1,int)
True
>>>isinstance('stuff',int)
False

Si desea obtener ints de raw_input

>>>x=raw_input('enter thing:')
enter thing: 3
>>>try: x = int(x)
   except: pass

>>>isinstance(x,int)
True
 17
Author: TehTris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-10 18:11:43

El isdigit el método del tipo str devuelve True si la cadena dada no es más que uno o más dígitos. Si no lo es, sabes que la cadena debe ser tratada como solo una cadena.

 5
Author: jwodder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-10 18:08:53

No compruebes. Sigue adelante y asume que es la entrada correcta, y captura una excepción si no lo es.

intresult = None
while intresult is None:
    input = raw_input()
    try: intresult = int(input)
    except ValueError: pass
 1
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-10 18:12:54

Dependiendo de su definición de shortly, puede usar una de las siguientes opciones:

 1
Author: Alexei Sholik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:47