Protocolo iterador

Hay dos funciones específicas para trabajar con iteradores.

int PyIter_Check(PyObject *o)

Return true if the object o supports the iterator protocol. This function always succeeds.

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

Retorna el siguiente valor de la iteración o. El objeto debe ser un iterador (depende de quién llama comprobar esto). Si no quedan valores restantes, retorna NULL sin establecer ninguna excepción. Si se produce un error al recuperar el elemento, retorna NULL y pasa la excepción.

Para escribir un bucle que itera sobre un iterador, el código en C debería verse así:

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 */
}