Comprobación de si una variable es un número entero o no

¿Cómo puedo comprobar si una variable es un número entero?

Solución

Si necesita hacer esto, haga

isinstance(, int)

a menos que estés en Python 2.x en cuyo caso querrás

isinstance(, (int, long))

No uses type. Casi nunca es la respuesta correcta en Python, ya que bloquea toda la flexibilidad del polimorfismo. Por ejemplo, si subclasificas int, tu nueva clase debe registrarse como int, cosa que type no hará:

class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True

Esto se adhiere al polimorfismo fuerte de Python: debe permitir cualquier objeto que se comporte como un int, en lugar de obligar a que lo sea.

BUT

La mentalidad clásica de Python, sin embargo, es que es más fácil pedir perdón que permiso. En otras palabras, no compruebe si x es un entero; asuma que lo es y capture los resultados de la excepción si no lo es:

try:
    x += 1
except TypeError:
    ...

Esta mentalidad está siendo lentamente superada por el uso de clases base abstractas, que te permiten registrar exactamente qué propiedades debe tener tu objeto (¿sumar? ¿multiplicar? ¿duplicar?) haciéndolo heredar de una clase especialmente construida. Esa sería la mejor solución, ya que permitirá exactamente esos objetos con los atributos necesarios y suficientes, pero tendrás que leer la documentación sobre cómo utilizarla.

Comentarios (14)
>>> isinstance(3, int)
True

Consulte aquí para obtener más información.

Tenga en cuenta que esto no ayuda si busca atributos de tipo int. En este caso, es posible que también desee comprobar la existencia de long:

>>> isinstance(3L, (long, int))
True

He visto comprobaciones de este tipo contra un tipo de matriz/índice en el código fuente de Python, pero no creo que sea visible fuera de C.

Respuesta de SO de Tokio: ¿Estás seguro de que deberías comprobar su tipo? O bien no pases un tipo que no puedas manejar, o bien no trates de ser más astuto que tus potenciales reutilizadores de código, pueden tener una buena razón para no pasar un int a tu función.

Comentarios (8)

Encontré una pregunta relacionada aquí en el propio SO.

Los desarrolladores de Python prefieren no comprobar los tipos, sino hacer una operación de tipo específico y atrapar una excepción TypeError. Pero si no sabes el tipo entonces tienes lo siguiente.

>>> i = 12345
>>> type(i)

>>> type(i) is int
True
Comentarios (3)