Question Vérifier si une variable est un entier ou non


Comment puis-je vérifier si une variable est un nombre entier?


629
2017-08-17 10:15


origine


Réponses:


Si vous avez besoin de faire cela, faites

isinstance(<var>, int)

sauf si vous êtes en Python 2.x auquel cas vous voulez

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

Ne pas utiliser type. Ce n'est presque jamais la bonne réponse en Python, car elle bloque toute la flexibilité du polymorphisme. Par exemple, si vous sous-classe int, votre nouvelle classe devrait s'inscrire comme int, lequel type ne fera pas:

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

Ceci adhère au polymorphisme fort de Python: vous devriez permettre à n'importe quel objet qui se comporte comme un int, au lieu de mandater que ce soit un.

MAIS

La mentalité classique de Python, cependant, est que c'est plus facile de demander pardon que la permission. En d'autres termes, ne vérifiez pas si x est un nombre entier supposer que c'est et attraper les résultats de l'exception si ce n'est pas:

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

Cette mentalité est lentement dépassée par l'utilisation de classes de base abstraites, qui vous permet d'enregistrer exactement les propriétés que devrait avoir votre objet (en ajoutant "multiplier? doubler") en le faisant hériter d'une classe spécialement construite. Ce serait la meilleure solution, puisqu'elle permettra exactement ces objets avec les attributs nécessaires et suffisants, mais vous devrez lire les docs sur la façon de l'utiliser.


740
2017-08-17 10:18



Toutes les réponses proposées jusqu'ici semblent manquer le fait qu'un double (floats en python est réellement double) peut aussi être un entier (s'il n'a rien après le point décimal). J'utilise le built-in is_integer() méthode sur les doubles pour vérifier cela.

Exemple (faire quelque chose chaque x fois dans une boucle for):

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

Modifier:

Vous pouvez toujours convertir en float avant d'appeler cette méthode. Les trois possibilités:

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

Sinon, vous pouvez vérifier si c'est un int d'abord comme Agostino a déclaré:

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 vous vraiment besoin de vérifier, il est préférable d'utiliser classes de base abstraites plutôt que des classes concrètes. Pour un entier qui signifierait:

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

Cela ne limite pas la vérification à juste int, ou juste int et long, mais permet également à d'autres types définis par l'utilisateur qui se comportent comme des entiers de fonctionner.


49
2017-09-05 15:08



>>> isinstance(3, int)
True

Voir ici pour plus.

Notez que cela n'aide pas si vous cherchez int-comme attributs Dans ce cas, vous pouvez également vérifier pour long:

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

J'ai vu des contrôles de ce type contre un type de tableau / index dans la source Python, mais je ne pense pas que ce soit visible en dehors de C.

Token SO réponse: Etes-vous sûr que vous devriez vérifier son type? Soit ne passez pas un type que vous ne pouvez pas gérer, ou n'essayez pas de déjouer vos réutiliseurs potentiels de code, ils peuvent avoir une bonne raison de ne pas passer un int à votre fonction.


29
2017-08-17 10:19



Pourquoi ne pas essayer quelque chose comme:

if x%1 == 0: 

17
2018-03-22 00:14



Plutôt que de trop compliquer les choses, pourquoi ne pas simplement

if type(var) is int:

17
2018-04-28 07:30



Voici un résumé des différentes méthodes mentionnées ici:

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

et voici comment ils s'appliquent à une variété de types numériques qui ont une valeur entière:

Table of methods for checking whether Python numerical types are integers

Vous pouvez voir qu'ils ne sont pas 100% cohérents. Fraction et Rational sont conceptuellement les mêmes, mais on fournit un .index()méthode et l'autre ne fonctionne pas. Les types complexes n'aiment pas convertir en int même si la partie réelle est intégrale et la partie imaginaire est 0.

(np.int8|16|32|64(5) signifie que np.int8(5), np.int32(5), etc. tous se comportent de manière identique)


15
2018-02-23 03:55