Diferencia entre int y números. Integral en Python.

Estoy tratando de entender mejor el modelo de datos de Python y no entiendo completamente el siguiente código:

>>> x = 1 >>> isinstance(x,int) True >>> isinstance(x,numbers.Integral) True >>> inspect.getmro(int) (, ) >>> inspect.getmro(numbers.Integral) (, , , , , ) 

Según lo anterior, parece que int y number.Integral no están en la misma jerarquía.

De la referencia de Python (2.6.6) veo

Números.Integral: representan elementos del conjunto matemático de enteros (positivo y negativo).

¿Cuál es la diferencia entre int y numbers.Integral ? ¿ numbers.Integral ? ¿Tiene algo que ver con el type int vs class numbers.Integral que veo en la salida anterior?

numbers define una jerarquía de clases abstractas que definen operaciones posibles en tipos numéricos. Ver PEP 3141 . La diferencia entre int y Integral es que int es un tipo concreto que admite todas las operaciones que Integral define.

 In [34]: numbers.Integral ? Type: ABCMeta Base Class:  String Form:  Namespace: Interactive File: c:\python26\lib\numbers.py Docstring: Integral adds a conversion to long and the bit-string operations. In [35]: int ? Type: type Base Class:  String Form:  Namespace: Python builtin Docstring: int(x[, base]) -> integer In [36]: type(int) == type (numbers.Integral) Out[36]: False In [39]: issubclass(int, numbers.Integral) Out[39]: True 

Integral es una clase base abstracta. int es una subclase de la Integral ABCMeta

Permíteme agregar dos cosas:

 isinstance(x,numbers.Integral) 

también cubre long y

 isinstance(x, int) 

no. Los numbers.Integral Prueba numbers.Integral estaría más cerca de

 isinstance(x, (int, long)) 

en Python 2 (Python 3 mató a lo long para siempre)

Prefiero la prueba con numbers.Integral . numbers.Integral , porque si se deriva de int (o long ), isinstance(y, numbers.Integral) seguirá siendo True .