Dans Java les types numériques descendent tous de Number, donc je les utiliserais.
(x instanceof Number).
Quel est l'équivalent python?
Dans les versions plus récentes de Python (2.6+; dans les anciennes versions, vous êtes plutôt limité à la vérification de quelques types codés en dur), la méthode correcte consiste à tester 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]
_
Ceci utilise ABCs et fonctionnera pour toutes les classes de type nombres intégrées, ainsi que pour toutes les classes tierces si elles valent leur sel (enregistrées en tant que sous-classes de Number
ABC) . Cependant, dans de nombreux cas, vous ne devriez pas vous soucier de vérifier manuellement la saisie - Python est saisi en mode canard et le mélange de types quelque peu compatibles fonctionne généralement bien. Cependant, un message d'erreur apparaît lorsque certaines opérations n'ont aucun sens ( _4 - "1"
_), il est donc rarement nécessaire de le vérifier manuellement. C'est juste un bonus, vous pouvez l'ajouter lorsque vous terminez ce module pour éviter de gêner les autres avec des détails d'implémentation.
Python 2: isinstance(x, (int, long, float, complex)) and not isinstance(x, bool)
Python 3: isinstance(x, (int, float, complex)) and not isinstance(x, bool)
Utilisez Number
à partir du module numbers
pour tester isinstance(n, Number)
(disponible depuis la version 2.6).
isinstance(n, numbers.Number)
Ici, il est en action 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
Ceci est, bien sûr, contraire à la frappe de canard. Si vous êtes plus préoccupé par le comportement d'un objet que par ce qu'il est, effectuez vos opérations comme si vous disposiez d'un numéro et utilisez des exceptions pour vous indiquer le contraire.
Bien sûr, vous pouvez utiliser isinstance
, mais sachez que ce n'est pas ainsi que Python fonctionne. Python est un langage typé "canard". Vous ne devriez pas vérifier explicitement vos types. Un TypeError
sera levé si le type incorrect a été passé.
Donc, supposons que c’est un int
. Pas la peine de vérifier.
Ce n'est pas vraiment comment python fonctionne. Utilisez-le comme un nombre, et si quelqu'un vous transmet quelque chose qui n'est pas un nombre, échouez. Il est de la responsabilité du programmeur de transmettre les types corrects.