Протокол итератора
Существуют две функции, предназначенные для работы с итераторами.
-
int PyIter_Check(PyObject *o) -
Возвращает true, если объект o поддерживает протокол итератора.
-
PyObject* PyIter_Next(PyObject *o) -
Возвращаемое значение: Новая ссылка.
Возвращает следующее значение из итерации o. Объект должен быть итератором (проверка этого возлагается на вызывающую сторону). Если больше значений нет, возвращает
NULLбез исключения. Если при получении элемента произошла ошибка, возвращаетNULLи передает исключение.
Для написания цикла, который итерируется по итератору, код на C должен выглядеть примерно так:
PyObject *iterator = PyObject_GetIter(obj);
PyObject *item;
if (iterator == NULL) {
/* propagate error */
}
while ((item = PyIter_Next(iterator))) {
/* do something with item */
...
/* release reference when done */
Py_DECREF(item);
}
Py_DECREF(iterator);
if (PyErr_Occurred()) {
/* propagate error */
}
else {
/* continue doing useful work */
}
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/c-api/iter.html