¿Cómo puedo comprobar si mi objeto python es un número? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

En Java todos los tipos numéricos descienden del Número, así que usaría

(x instanceof Number).

¿Cuál es el equivalente de python?

Author: MERose, 2010-11-15

6 answers

En las versiones más recientes de Python (2.6+; en las versiones anteriores, se limita a verificar algunos tipos codificados), la forma correcta es probar si su variable es una instancia 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]

Esto usa ABCs y funcionará para todas las clases tipo número incorporadas, y también para todas las clases de terceros si valen su sal (registradas como subclases del Number ABC). Sin embargo, en muchos casos no debería preocuparse por verificar los tipos escritos manualmente-Python es de tipo pato y mezclar tipos algo compatibles generalmente funciona, sin embargo, emitirá un mensaje de error cuando alguna operación no tenga sentido (4 - "1"), por lo que la comprobación manual rara vez es realmente necesaria. Es solo una ventaja, puede agregarla al terminar este módulo para evitar molestar a otros con detalles de implementación.

 178
Author: Delgan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-11 10:59:51

Creo que esto funcionaría:

isinstance(x, (int, long, float, complex))

 140
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-26 17:40:08

Utilice Number desde el módulo numbers para probar isinstance(n, Number) (disponible desde 2.6).

isinstance(n, numbers.Number)

Aquí está en acción con varios tipos de números y un no número:

>>> 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

Esto es, por supuesto, contrario a duck typing. Si le preocupa más cómo actúa un objeto que qué es, realice sus operaciones como si tuviera un número y use excepciones para decirle lo contrario.

 45
Author: Steven Rumbalski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-07 18:03:56

Seguro que puedes usar isinstance, pero ten en cuenta que así no es como funciona Python. Python es un lenguaje de tipo pato. No debe verificar explícitamente sus tipos. Un TypeError se levantará si se pasó el tipo incorrecto.

Así que solo asume que es un int. No te molestes en comprobarlo.

 1
Author: user225312,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-15 17:47:17

Así no es como funciona python. Solo úsalo como lo harías con un número, y si alguien te pasa algo que no es un número, falla. Es responsabilidad del programador pasar los tipos correctos.

 0
Author: Falmarri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-15 17:38:26

Parece que funciona

isinstance(TheNumber, (int,float, ...)
 -10
Author: Amin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-04 06:57:05