Protocole d’itération
*********************

Nouveau dans la version 2.2.

Il existe deux fonctions dédiées à l’interaction avec les itérateurs.

int PyIter_Check(PyObject *o)

   Renvoie vrai si l’objet *o* supporte le protocole d’itération.

   This function can return a false positive in the case of old-style
   classes because those classes always define a "tp_iternext" slot
   with logic that either invokes a "next()" method or raises a
   "TypeError".

PyObject* PyIter_Next(PyObject *o)
    *Return value: New reference.*

   Renvoie la valeur suivante d’une itération de *o*. L’objet doit
   être un itérateur (c’est à l’appelant de faire cette vérification).
   Renvoie *NULL* s’il n’y a plus de valeurs, sans déclarer
   d’exception. Renvoie *NULL* en déclarant une exception si une
   erreur survient lors de la récupération d’un élément.

Pour écrire une boucle itérant un itérateur, le code C devrait
ressembler à :

   PyObject *iterator = PyObject_GetIter(obj);
   PyObject *item;

   if (iterator == NULL) {
       /* propagate error */
   }

   while (item = PyIter_Next(iterator)) {
       /* do something with item */
       ...
       /* release reference when done */
       Py_DECREF(item);
   }

   Py_DECREF(iterator);

   if (PyErr_Occurred()) {
       /* propagate error */
   }
   else {
       /* continue doing useful work */
   }
