283 votes

Comment puis-je vérifier si mon objet python est un nombre ?

En Java, les types numériques descendent tous de Number, donc j'utiliserais

(x instanceof Number).

Quelle est l'équivalent en Python ?

1 votes

Pas vraiment un doublon, l'autre est un cas très spécifique de cette question (vérifier si quelque chose est un nombre dans un vecteur), et la plupart des réponses les plus votées concernent vraiment ce détail.

1 votes

Multiplier x par zéro. si le résultat est différent de zéro, alors x n'est pas un nombre voir: stackoverflow.com/a/44418960/3419693

336voto

delnan Points 52260

Vérifiez si votre variable est une instance de numbers.Number :

>>> import numbers
>>> import decimal
>>> [isinstance(x, numbers.Number) for x in (0, 0.0, 0j, decimal.Decimal(0))]
[True, True, True, True]

Cela utilise les ABCs et fonctionnera pour toutes les classes numériques intégrées, ainsi que pour toutes les classes tierces si elles en valent la peine (enregistrées en tant que sous-classes des ABC Number).

Cependant, dans de nombreux cas, vous ne devriez pas vous soucier de vérifier les types manuellement - Python est duck-typé et mélanger des types quelque peu compatibles fonctionne généralement, mais il affichera un message d'erreur lorsque certaines opérations n'ont pas de sens (4 - "1"), donc vérifier cela manuellement n'est généralement pas vraiment nécessaire. C'est juste un bonus. Vous pouvez l'ajouter en finissant un module pour éviter de harceler les autres avec des détails d'implémentation.

Ceci fonctionne à partir de Python 2.6. Sur les anciennes versions, vous êtes pratiquement limité à vérifier quelques types codés en dur.

13 votes

Cela renvoie un faux positif lorsque vous lui passez un booléen : isinstance(True, numbers.Number) renvoie True même si True n'est clairement pas un nombre.

4 votes

@AlexKahn En Python, les booléens sont pratiquement des nombres : bool hérite de int, abs(True) == 1, "foo" * False == "", sum([True, False, True]) == 2, "%f" % True == "1.0", et ainsi de suite.

14 votes

Frustrant, isinstance(float('nan'), numbers.Number) retourne True

238voto

Matt Points 2126

Python 3:

isinstance(x, (int, float, complex)) and not isinstance(x, bool)

Python 2:

isinstance(x, (int, long, float, complex)) and not isinstance(x, bool)

Notez que cette réponse ne fonctionne pas correctement pour les objets Numpy.

3 votes

Merci, voici ce qui a finalement fonctionné pour moi en Jython (qui est python 2.5 donc il n'a pas le paquet 'numbers'). Et oui, j'ai une vraie raison de casser la typage canard ; j'ai besoin de traiter les chaînes de caractères et les nombres différemment.

16 votes

isinstance(Décimal(10), (int, long, float, complex)) donne Faux. -1

12 votes

Cela ne fonctionne pas non plus si x est un booléen. isinstance(True, (int, long, float, complex)) renvoie True.

62voto

Steven Rumbalski Points 16838

Utilisez Number du module numbers pour tester isinstance(n, Number) (disponible depuis 2.6).

isinstance(n, numbers.Number)

Voici un exemple avec différents types de nombres et un non-nombre :

>>> from numbers import Number
... from decimal import Decimal
... from fractions import Fraction
... for n in [2, 2.0, Decimal('2.0'), complex(2,0), Fraction(2,1), '2']:
...     print '%15s %s' % (n.__repr__(), isinstance(n, Number))
              2 True
            2.0 True
 Decimal('2.0') True
         (2+0j) True
 Fraction(2, 1) True
            '2' False

Cela va bien sûr à l'encontre du duck typing. Si vous êtes plus préoccupé par le comportement d'un objet que par sa nature, effectuez vos opérations comme si vous aviez un nombre et utilisez les exceptions pour vous indiquer le contraire.

15 votes

La stratégie "vérifier s'il y a une exception" est souvent inefficace. Python est un peu agressif en permettant des opérations de type arithmétique sur toutes sortes de choses non arithmétiques - donc simplement parce qu'un objet permet + ou * ne signifie pas du tout qu'il est semblable à un nombre.

1voto

jcomeau_ictx Points 15736

Estinstance(1, int) # fonctionne pour les entiers.

pas sûr de tous les différents types de nombres dans un seul test.

-12voto

Falmarri Points 20281

Ce n'est pas vraiment comment fonctionne Python. Utilisez-le simplement comme vous le feriez avec un nombre, et si quelqu'un vous passe quelque chose qui n'est pas un nombre, échouez. C'est la responsabilité du programmeur de passer les bons types.

0 votes

Spécifiquement, utilisez except TypeError:. Les exceptions sont relativement coûteuses, cependant.

7 votes

... mais seulement s'ils sont déclenchés. Dans le cas "normal", ils sont moins chers qu'une instruction if.

9 votes

Ce n'est pas toujours aussi simple, parfois les deux types prennent en charge l'interface mais vous voulez les traiter différemment. Considérez une fonction de réduction qui devrait ajouter des nombres mais pas concaténer des chaînes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X