Протокол итератора¶
Специально для работы с итераторами существует две функции.
-
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 {
/* продолжить выполнять полезную работу */
}