Quieres comprobar si algún objeto
actúa como un número en determinadas circunstancias
Si está utilizando Python 2.5 o anterior, la única forma real es verificar algunas de esas "ciertas circunstancias" y ver.
En 2.6 o superior, puede usar isinstance
con números . Número : una clase base abstracta (ABC) que existe exactamente para este propósito (existen muchos más ABC en el collections
módulo para varias formas de colecciones / contenedores, nuevamente comenzando con 2.6; y, Además, solo en esas versiones, puede agregar fácilmente sus propias clases base abstractas si es necesario).
Bach a 2.5 y anteriores, "se puede agregar 0
y no es iterable" podría ser una buena definición en algunos casos. Pero, realmente debe preguntarse qué es lo que está preguntando que lo que quiere considerar "un número" definitivamente debe poder hacer , y qué debe ser absolutamente incapaz de hacer, y verificar.
Esto también puede ser necesario en 2.6 o posterior, quizás con el propósito de hacer sus propios registros para agregar los tipos que le interesan y en los que aún no se han registrado numbers.Numbers
, si desea excluir algunos tipos que afirman que son números, pero usted simplemente no puedo manejar, eso requiere aún más cuidado, ya que los ABC no tienen ningún unregister
método [[por ejemplo, puede hacer su propio ABC WeirdNum
y registrar allí todos los tipos extraños para usted, luego primero verifique isinstance
que estén disponibles antes de continuar a la comprobación isinstance
de lo normal numbers.Number
para continuar con éxito.
Por cierto, siempre que necesite verificar si x
puede o no puede hacer algo, generalmente debe probar algo como:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
La presencia de __add__
per se no le dice nada útil, ya que, por ejemplo, todas las secuencias lo tienen con el propósito de concatenación con otras secuencias. Esta comprobación es equivalente a la definición "un número es algo tal que una secuencia de tales cosas es un único argumento válido para la función incorporada sum
", por ejemplo. Los tipos totalmente extraños (por ejemplo, los que generan la excepción "incorrecta" cuando se suman a 0, como, por ejemplo, a ZeroDivisionError
o ValueError
& c) propagarán la excepción, pero está bien, deje que el usuario sepa lo antes posible que esos tipos locos simplemente no son aceptables en el bien empresa;-); pero, un "vector" que se puede sumar a un escalar (la biblioteca estándar de Python no tiene uno, pero por supuesto son populares como extensiones de terceros) también daría un resultado incorrecto aquí, así que (por ejemplo,el "no permitido que sea iterable" (por ejemplo, verificar que iter(x)
aumente TypeError
, o la presencia de un método especial __iter__
, si está en 2.5 o antes y, por lo tanto, necesita sus propias verificaciones).
Un breve vistazo a tales complicaciones puede ser suficiente para motivarte a confiar en clases base abstractas siempre que sea posible ... ;-).