Pregunta Verificando si una variable es un entero o no


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


629
2017-08-17 10:15


origen


Respuestas:


Si necesita hacer esto, haga

isinstance(<var>, int)

a menos que esté en Python 2.x en cuyo caso desea

isinstance(<var>, (int, long))

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

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

Esto se adhiere al fuerte polimorfismo de Python: debes permitir que cualquier objeto que se comporte como un int, en lugar de exigir que sea uno.

PERO

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

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

Esta mentalidad está siendo superada lentamente por el uso de clases base abstractas, que le permite registrar exactamente qué propiedades debe tener su objeto (agregando "multiplicando", "doblando") haciéndolo heredar de una clase especialmente construida. Esa sería la mejor solución, ya que permitirá exactamente aquellos objetos con los atributos necesarios y suficientes, pero tendrá que leer los documentos sobre cómo usarlos.


740
2017-08-17 10:18



Todas las respuestas propuestas hasta ahora parecen perder el hecho de que un doble (floats en python son en realidad dobles) también puede ser un entero (si no tiene nada después del punto decimal). Yo uso el built-in is_integer() método en dobles para verificar esto.

Ejemplo (hacer algo cada x vez en un ciclo for):

for index in range(y): 
    # do something
    if (index/x.).is_integer():
        # do something special

Editar:

Siempre puede convertir a un flotador antes de llamar a este método. Las tres posibilidades:

>>> float(5).is_integer()
True
>>> float(5.1).is_integer()
False
>>> float(5.0).is_integer()
True

De lo contrario, podría verificar si es una int primero, como dijo Agostino:

def is_int(val):
    if type(val) == int:
        return True
    else:
        if val.is_integer():
            return True
        else:
            return False

76
2018-02-13 19:45



Si tu De Verdad necesita comprobar, entonces es mejor usar clases base abstractas en lugar de clases concretas Para un entero que significaría:

>>> import numbers
>>> isinstance(3, numbers.Integral)
True

Esto no restringe el control a solo int, o solo int y long, pero también permite que funcionen otros tipos definidos por el usuario que se comportan como enteros.


49
2017-09-05 15:08



>>> isinstance(3, int)
True

Ver aquí para más.

Tenga en cuenta que esto no ayuda si está buscando intatributos parecidos En este caso, es posible que también desee verificar long:

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

He visto comprobaciones de este tipo en una matriz / tipo de índice en la fuente de Python, pero no creo que eso sea visible fuera de C.

Token SO respuesta: ¿Estás seguro de que deberías verificar su tipo? O bien, no pases un tipo que no puedas manejar, o no intentes burlar a tus potenciales reutilizadores de código, es posible que tengan una buena razón para no pasar un int a tu función.


29
2017-08-17 10:19



Por qué no probar algo como:

if x%1 == 0: 

17
2018-03-22 00:14



En lugar de complicar demasiado las cosas, ¿por qué no simplemente un simple

if type(var) is int:

17
2018-04-28 07:30



Aquí hay un resumen de los diferentes métodos mencionados aquí:

  • int(x) == x
  • try x = operator.index(x)
  • isinstance(x, int)
  • isinstance(x, numbers.Integral)

y así es como se aplican a una variedad de tipos numéricos que tienen un valor entero:

Table of methods for checking whether Python numerical types are integers

Puedes ver que no son 100% consistentes. Fraction y Rational son conceptualmente iguales, pero uno proporciona .index()método y el otro no. A los tipos complejos no les gusta convertir a int incluso si la parte real es integral y la parte imaginaria es 0.

(np.int8|16|32|64(5) significa que np.int8(5), np.int32(5), etc. todos se comportan de manera idéntica)


15
2018-02-23 03:55