Vous voulez vérifier si un objet
agit comme un nombre dans certaines circonstances
Si vous utilisez Python 2.5 ou une version antérieure, le seul vrai moyen est de vérifier certaines de ces «circonstances» et de voir.
Dans la version 2.6 ou supérieure, vous pouvez utiliser isinstance
avec des nombres.Number - une classe de base abstraite (ABC) qui existe exactement à cette fin (beaucoup plus d'ABC existent dans lecollections
module pour diverses formes de collections / conteneurs, commençant à nouveau par 2.6; et, également uniquement dans ces versions, vous pouvez facilement ajouter vos propres classes de base abstraites si vous en avez besoin).
Bach à 2.5 et plus tôt, "peut être ajouté 0
et n'est pas itérable" pourrait être une bonne définition dans certains cas. Mais, vous devez vraiment vous demander ce que vous demandez que ce que vous voulez considérer comme "un nombre" doit certainement pouvoir faire , et ce qu'il ne doit absolument pas être de faire - et de vérifier.
Cela peut également être nécessaire dans la version 2.6 ou ultérieure, peut-être dans le but de faire vos propres enregistrements pour ajouter des types qui vous intéressent et qui ne sont pas déjà enregistrés numbers.Numbers
- si vous souhaitez exclure certains types qui prétendent être des numéros, mais vous ne peut tout simplement pas gérer, cela prend encore plus de soin, car les ABC n'ont pas de unregister
méthode [[par exemple, vous pouvez créer votre propre ABC WeirdNum
et y enregistrer tous ces types bizarres pour vous, puis vérifiez d'abord si cela vous permet isinstance
de renflouer avant de continuer à la vérification isinstance
de la normale numbers.Number
pour continuer avec succès.
BTW, si et quand vous avez besoin de vérifier si vous x
pouvez ou ne pouvez pas faire quelque chose, vous devez généralement essayer quelque chose comme:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
La présence de en __add__
soi ne vous dit rien d'utile, puisque par exemple toutes les séquences l'ont dans le but de concaténer avec d'autres séquences. Cette vérification équivaut à la définition «un nombre est quelque chose de tel qu'une séquence de telles choses est un argument unique valide pour la fonction intégrée sum
», par exemple. Les types totalement étranges (par exemple ceux qui lèvent la "mauvaise" exception lorsqu'ils sont sommés à 0, comme, par exemple, a ZeroDivisionError
ou ValueError
& c) propageront l'exception, mais c'est OK, faites savoir à l'utilisateur dès que possible que ces types fous ne sont tout simplement pas acceptables en bon compagnie;-); mais, un "vecteur" qui peut être sommé en un scalaire (la bibliothèque standard de Python n'en a pas, mais bien sûr, ils sont populaires en tant qu'extensions tierces) donnerait également un résultat erroné ici, donc (par exemplecelui «non autorisé à être itérable» (par exemple, chèque qui iter(x)
soulève TypeError
, ou pour la présence d'une méthode spéciale __iter__
- si vous êtes en version 2.5 ou antérieure et que vous avez donc besoin de vos propres vérifications).
Un bref aperçu de ces complications peut être suffisant pour vous motiver à vous fier à la place à des classes de base abstraites chaque fois que c'est possible ... ;-).