Протокол итератора
Существует две функции, специально предназначенные для работы с итераторами.
-
int PyIter_Check(PyObject *o) -
Часть Стабильной ABI с версии 3.8.
Возвращает ненулевое значение, если объект o можно безопасно передать в
PyIter_Next(), и0в противном случае. Эта функция всегда выполняется успешно.
-
int PyAIter_Check(PyObject *o) -
Часть Стабильной ABI с версии 3.10.
Возвращает ненулевое значение, если объект o поддерживает протокол
AsyncIterator, и0в противном случае. Эта функция всегда выполняется успешно.Добавлена в версии 3.10.
-
PyObject *PyIter_Next(PyObject *o) -
Возвращаемое значение: Новая ссылка. Часть Стабильной ABI.
Возвращает следующее значение из итератора o. Объект должен быть итератором в соответствии с
PyIter_Check()(проверка этого возлагается на вызывающую сторону). Если значений больше нет, возвращает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 */
}
-
type PySendResult -
Значение перечисления, используемое для представления различных результатов
PyIter_Send().Добавлена в версии 3.10.
-
PySendResult PyIter_Send(PyObject *iter, PyObject *arg, PyObject **presult) -
Часть Стабильной ABI с версии 3.10.
Отправляет значение arg в итератор iter. Возвращает:
-
PYGEN_RETURNесли итератор возвращает значение. Значение возврата передаётся через presult. -
PYGEN_NEXTесли итератор генерирует значение. Сгенерированное значение передаётся через presult. -
PYGEN_ERRORесли итератор вызвал исключение. presult устанавливается вNULL.
Добавлена в версии 3.10.
-
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/c-api/iter.html