Протокол итератора¶
Есть две функции, специально предназначенные для работы с итераторами.
-
int
PyIter_Check(PyObject *o)¶ - Part of the Stable ABI since version 3.8.
Возвращает ненулевое значение, если объект o может быть безопасно передан в
PyIter_Next(), и0в противном случае. Эта функция всегда успешна.
-
int
PyAIter_Check(PyObject *o)¶ - Part of the Stable ABI since version 3.10.
Возвращает ненулевое значение, если объект o обеспечивает протокол
AsyncIterator, и0в противном случае. Эта функция всегда успешна.Добавлено в версии 3.10.
-
PyObject *
PyIter_Next(PyObject *o)¶ - Return value: New reference. Part of the Stable ABI.
Возвращает следующее значение из итератора o. Объект должен быть итератором в соответствии с
PyIter_Check()(проверка этого зависит от вызывающей стороны). Если оставшихся значений нет, возвращаетсяNULLбез установленного исключения. Если при извлечении элемента произошла ошибка, возвращаетсяNULLи передается исключение.
Чтобы написать цикл, который выполняет итерацию по итератору, код на языке Си должен выглядеть примерно так:
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)¶ - Part of the Stable ABI since version 3.10.
Отправляет значение arg в итератор iter. Возвращает:
PYGEN_RETURNесли возвращается итератор. Возвращаемое значение возвращается через presult.PYGEN_NEXTесли итератор возвращается. Полученное значение возвращается через presult.PYGEN_ERRORесли итератор поднял исключение. presult имеет значениеNULL.
Добавлено в версии 3.10.