Protocolo iterador¶
Hay dos funciones específicas para trabajar con iteradores.
-
int
PyIter_Check
(PyObject *o)¶ Retorna verdadero si el objeto o admite el protocolo iterador. Esta función siempre finaliza con éxito.
-
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, retornaNULL
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 */
}