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