Протокол итератора
Существуют две функции, специально предназначенные для работы с итераторами.
-
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.11/c-api/iter.html