Документация Python неофициальный перевод

Протокол итератораIterator Protocol

Есть две функции, предназначенные для работы с итераторами.

int PyIter_Check(PyObject *o)

Возвращает истину, если объект o поддерживает протокол итератора.

PyObject* PyIter_Next(PyObject *o)
Возвращаемое значение: новая ссылка.

Возвращает следующее значение из итерации o. Объект должен быть итератором (проверка возлагается на вызывающую сторону). Если значений больше нет, возвращает NULL без установки исключения. Если при получении элемента возникает ошибка, возвращает NULL и передаёт исключение дальше.

Чтобы написать цикл, который выполняет итерацию по итератору, код на C должен выглядеть примерно так:

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

if (iterator == NULL) {
    /* распространить ошибку */
}

while (item = PyIter_Next(iterator)) {
    /* сделать что-то с элементом */
    ...
    /* освободить ссылку по завершении */
    Py_DECREF(item);
}

Py_DECREF(iterator);

if (PyErr_Occurred()) {
    /* распространить ошибку */
}
else {
    /* продолжить выполнение полезной работы */
}