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