standard pycodestyle online autopep8 python python-2.5 pep8

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