Протокол итератора¶Iterator Protocol
Новое в версии 2.2.
Есть две функции, предназначенные для работы с итераторами.
-
int
PyIter_Check(PyObject *o)¶ Возвращает истину, если объект o поддерживает протокол итератора.
Эта функция может давать ложноположительный результат для классов старого стиля, поскольку такие классы всегда определяют слот
tp_iternext, логика которого либо вызывает методnext(), либо порождаетTypeError.
-
PyObject*
PyIter_Next(PyObject *o)¶ - Возвращаемое значение: новая ссылка.
Возвращает следующее значение из итерации o. Объект должен быть итератором (проверка возлагается на вызывающую сторону). Если значений больше нет, возвращает NULL без установки исключения. Если при получении элемента возникает ошибка, возвращает NULL и передаёт исключение дальше.
Чтобы написать цикл, который выполняет итерацию по итератору, код на C должен выглядеть примерно так:
PyObject *iterator = PyObject_GetIter(obj);
PyObject *item;
if (iterator == NULL) {
/* распространить ошибку */
}
while ((item = PyIter_Next(iterator))) {
/* сделать что-то с элементом */
...
/* освободить ссылку по завершении */
Py_DECREF(item);
}
Py_DECREF(iterator);
if (PyErr_Occurred()) {
/* распространить ошибку */
}
else {
/* продолжить выполнение полезной работы */
}