Протокол итератора¶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 {
/* продолжить выполнение полезной работы */
}