Los desarrolladores de
NumPy tenían un problema que sólo se podía resolver añadiendo un nuevo método especial,
__index__. Al usar la notación de recorte (
slices), o sea, cosas como
[inicio:final:incremento] , los valores de
inicio,
final e
incremento debían ser siempre enteros o enteros largos. NumPy, sin embargo, define un conjunto de tipos de números enteros especializados, por ejemplo, enteros con signo o sin signo, con tamaños de 8, 16, 32 o 64 bits. El problema era que no había ningún sistema para indicar que estos tipos también podían ser usados como índices en las operaciones de recorte.
Es verdad que ya existía el método especial
__int__, que se utiliza para realizar una conversión implícita a números enteros. Sin embargo, utilizar dicho método provocaría que los números en coma flotante también serían utilizables como índices en las operaciones de recorte, un comportamiento que es claramente poco deseable.
Por eso se ha introducido el nuevo método especial
__index__. No acepta ningún argumento, y devuelve un entero que se utilizará para las operaciones de recorte. Por ejemplo:
class C:
def __index__(self):
return self.value
El valor retornado debe ser obligatoriamente un entero o un entero largo de Python. El interprete comprobará el tipo, y elevará una excepción de tipo
TypeError en caso de no cumplirse esta restricción.
Para los que estén escribiendo extensiones en
C, se ha añadido una entrada o
slot nb_index en la estructura
PyNumberMethods, que permite a las extensiones implementar este protocolo. Se puede utilizar
PyNumber_Index(obj) para llamar a la función
__index__ y obtener su resultado.
Se puede obtener más información de esta ampliación leyendo el PEP original:
PEP 357, Allowing Any Object to be Used for Slicing.
Más información sobre las novedades en Python 2.5
Ver comentarios