__getitem__
est antérieur au protocole des itérateurs, et était dans le passé le uniquement manière de rendre les choses itérables. En tant que tel, il est toujours supporté comme une méthode d'itération. Essentiellement, le protocole d'itération est le suivant :
-
Vérifiez si un __iter__
méthode. S'il existe, utilisez le nouveau protocole d'itération.
-
Sinon, essayez d'appeler __getitem__
avec des valeurs entières de plus en plus grandes jusqu'à ce qu'il déclenche IndexError.
(2) était la seule façon de le faire, mais elle avait l'inconvénient de supposer plus que ce qui était nécessaire pour supporter l'itération. Pour supporter l'itération, vous deviez supporter l'accès aléatoire, ce qui était beaucoup plus coûteux pour des choses comme les fichiers ou les flux réseau où avancer était facile, mais revenir en arrière nécessitait de tout stocker. __iter__
permettait l'itération sans accès aléatoire, mais puisque l'accès aléatoire permet généralement l'itération de toute façon, et parce que briser la compatibilité en arrière serait mauvais, __getitem__
est toujours supporté.