PEP 357: La méthode "__index__" pour le slicing
Un nouvelle méthode spéciale , __index__ a été ajoutée pour permettre d'utiliser un objet quelconque comme index d'un slicing.
Les développeurs de NumPy avaient un problème qui ne pouvait être résolu que par l'ajout d'une nouvelle méthode spéciale : __index__. Quand on utilise la notation de slicing, comme dans "[début:fin:pas]", les valeurs de début, fin et pas doivent tous être soit des entiers, soit des entiers long. NumPy définit une grande variété de type d'entier spécialisé correspondants à des entier signé et non signé de 8, 16, 32 et 64 bits, mais il n'y avait aucun moyen de signaler que ces types pouvaient être utilisé comme index d'un slicing.
Le slicing ne peut pas se contenter d'utilier la méthode __int__ existante car cette méthode est aussi utilisée pour implémenter la coercition vers les entiers. Si le slicing utilisait __int__, les nombres entier pourraient aussi devenir des index légaux et c'est clairement un comportement indésirable.
Par exemple :
class C:
def __index__ (self):
return self.value
La valeur de retour peut être un entier Python ou un entier long. L'interpréteur vérifiera que le type retourné est correct, et lèvera une exception TypeError dans le cas contraire.
Un champ nb_index a été ajouté à la structure C PyNumberMethods pour permettres aux extensions C d'implémenter ce protocole. PyNumber_Index(obj) peut être utilisé dans le code des extensions pour apeller la fonction __index__ et récupérer le résultat.

