Vous voulez vérifier si un objet
agit comme un certain nombre dans certaines
circonstances
Si vous êtes à l'aide de Python 2.5 ou plus, la seule façon est de vérifier certains de ces "certaines circonstances" et de voir.
2.6 ou mieux, vous pouvez utiliser isinstance
avec des chiffres.Nombre -- une classe de base abstraite (ABC) qui existe exactement pour ce but (beaucoup plus Abc existent dans l' collections
module pour les diverses formes de collections ou de récipients, en commençant à nouveau par 2.6; et, aussi que dans ces versions, vous pouvez facilement ajouter vos propres classes de base abstraites si vous avez besoin).
De Bach à 2.5 et les versions antérieures,
"peut être ajouté à l' 0
et n'est pas itératif" pourrait être une bonne définition dans certains cas. Mais,
vous avez vraiment besoin de vous demander ce que c'est que vous vous demandez ce que vous voulez à considérer "un certain nombre" doit certainement être en mesure de le faire, et ce qu'elle doit être absolument incapable de le faire -- et vérifier.
Cela peut aussi être nécessaire en 2.6 ou version ultérieure, peut-être dans le but de faire vos propres enregistrements pour ajouter des types de soins à ce sujet n'est pas déjà être inscrit sur numbers.Numbers
- si vous souhaitez exclure certains types qui prétendent qu'ils sont des numéros, mais vous ne pouvez pas gérer, qui prend encore plus de soin, comme l'Abc ont pas d' unregister
[[par exemple, vous pourriez faire votre propre ABC WeirdNum
et y inscrire toutes ces bizarre-pour-vous les types, puis vérifiez tout d'abord pour isinstance
de celle-ci pour renflouer avant de procéder à la vérification de isinstance
de la normale numbers.Number
pour continuer avec succès.
BTW, si et quand vous en avez besoin pour vérifier si x
peut ou ne peut pas faire quelque chose, vous pouvez généralement essayez quelque chose comme:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
La présence d' __add__
soi vous dit rien d'utile, puisque e.g toutes les séquences ont pour objectif de concaténation avec d'autres séquences. Cette vérification est équivalente à la définition "un nombre est quelque chose de tel qu'une séquence de telles choses est valable un seul argument à la fonction builtin sum
", par exemple. Complètement dingue de types (par exemple celles qui augmentent le "mauvais" exception lorsque additionnés à 0, comme, disons, un ZeroDivisionError
ou ValueError
&c) de propagation d'exception, mais c'est OK, permettre à l'utilisateur de connaître le plus tôt possible qu'un tel fou types sont tout simplement pas acceptable en bonne compagnie;-); mais, d'un "vecteur" c'est summable un scalaire (Python standard library n'en a pas, mais bien sûr, ils sont populaires en tant que tierce partie extensions) permettrait également de donner le mauvais résultat ici, donc (par exemple) cette vérification doit venir après le "n'est pas autorisé à être itératif" (par exemple, vérifier qu' iter(x)
soulève TypeError
, ou de la présence de méthode particulière, __iter__
-- si vous êtes en 2.5 ou version antérieure, et donc besoin de vos propres contrôles).
Un bref coup d'œil à l'une de ces complications peut être suffisant pour vous motiver à s'appuyer plutôt sur les classes de base abstraites dans la mesure du possible...;-).