En Java, les types numériques descendent tous de Number, donc j'utiliserais
(x instanceof Number).
Quelle est l'équivalent en Python ?
En Java, les types numériques descendent tous de Number, donc j'utiliserais
(x instanceof Number).
Quelle est l'équivalent en Python ?
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.
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.
@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.
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.
Cela ne fonctionne pas non plus si x
est un booléen. isinstance(True, (int, long, float, complex))
renvoie True
.
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.
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.
Spécifiquement, utilisez except TypeError:
. Les exceptions sont relativement coûteuses, cependant.
... mais seulement s'ils sont déclenchés. Dans le cas "normal", ils sont moins chers qu'une instruction if
.
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 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.
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