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

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

int PyIter_Check(PyObject *o)

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