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

Специально для работы с итераторами существует две функции.

int PyIter_Check(PyObject *o)

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

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

Возвращает следующее значение из итерации 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 {
    /* продолжить выполнять полезную работу */
}