web-dev-qa-db-fra.com

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

Dans Java les types numériques descendent tous de Number, donc je les utiliserais.

(x instanceof Number).

Quel est l'équivalent python?

177
Neal Ehardt

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 NumberABC) . 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.

219
user395760

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)

161
Matt

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.

49
Steven Rumbalski

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.

1
user225312

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.

0
Falmarri