Протокол итератора
Для работы с итераторами предназначены две функции.
-
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–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/iter.html