pycodestyle - ¿Cómo usar python''s isinstance() para verificar si una variable es un número?
pep8 python (3)
Dependiendo de lo que esté usando esto en la tipificación de patos, podría ser un mejor enfoque ( certainly commonly recommended ). El problema con el enfoque de Martijn Pieters es que siempre perderá algunos tipos de números de su lista. En la parte superior de mi cabeza, tu código no funcionará con: números racionales sympy, enteros de precisión arbitrarios y cualquier implementación de números complejos.
Una alternativa es escribir una función como esta:
def is_number(thing):
try:
thing + 1
return True
except TypeError:
return False
Este código debería funcionar con cualquier implementación razonable de un número. Por supuesto, hay una desventaja importante: también funcionará con una implementación irrazonable de muchos no-números (es decir, si el operador plus está sobrecargado y acepta un número entero).
Otra alternativa (dependiendo de por qué necesita saber si algo es un número) es simplemente asumir que se trata de un número, y si no es así, se generarán errores por cualquier parte del código que requiera un número.
No estoy diciendo que estos enfoques sean siempre mejores (a diferencia de algunas personas ...) solo que valen la pena considerarlos.
Encontré un viejo código de Python que estaba haciendo algo como:
if type(var) is type(1):
...
Como se esperaba, pep8
queja de este uso recomendado de isinstance()
.
Ahora, el problema es que el módulo de numbers
fue agregado en Python 2.6 y necesito escribir código que funcione con Python 2.5+
Entonces, if isinstance(var, Numbers.number)
no es una solución.
¿Cuál sería la solución adecuada en este caso?
En Python 2, puede usar el módulo de types
:
>>> import types
>>> var = 1
>>> NumberTypes = (types.IntType, types.LongType, types.FloatType, types.ComplexType)
>>> isinstance(var, NumberTypes)
True
Tenga en cuenta el uso de una tupla para probar contra varios tipos.
Debajo del capó, IntType
es solo un alias para int
, etc .:
>>> isinstance(var, (int, long, float, complex))
True
El tipo complex
requiere que su python se haya compilado con soporte para números complejos; si quieres protegerlo, usa un bloque try / except:
>>> try:
... NumberTypes = (types.IntType, types.LongType, types.FloatType, types.ComplexType)
... except AttributeError:
... # No support for complex numbers compiled
... NumberTypes = (types.IntType, types.LongType, types.FloatType)
...
o si solo usa los tipos directamente:
>>> try:
... NumberTypes = (int, long, float, complex)
... except NameError:
... # No support for complex numbers compiled
... NumberTypes = (int, long, float)
...
En Python 3, los types
ya no tienen alias de tipo estándar, el complex
siempre está habilitado y ya no existe una diferencia long
versus int
, por lo que en Python 3 siempre se usa:
NumberTypes = (int, float, complex)
Por último, pero no menos importante, puede usar los numbers.Numbers
tipos de base abstractos (nuevos en Python 2.6) para admitir también los tipos numéricos personalizados que no se derivan directamente de los tipos anteriores:
>>> import numbers
>>> isinstance(var, numbers.Number)
True
Esta comprobación también devuelve True
para los decimal.Decimal()
y fractions.Fraction()
.
Este módulo asume que el tipo complex
está habilitado; obtendrá un error de importación si no es así.
Python 2 admite cuatro tipos para números int
, float
, long
y complex
y python 3.x
admite 3: int
, float
y complex
>>> num = 10
>>> if isinstance(num, (int, float, long, complex)): #use tuple if checking against multiple types
print(''yes it is a number'')
yes it is a number
>>> isinstance(num, float)
False
>>> isinstance(num, int)
True
>>> a = complex(1, 2)
>>> isinstance(a, complex)
True