Протокол итератора¶Iterator Protocol
Есть всего несколько функций, специально предназначенных для работы с итераторами.
- PyObject* PyIter_Next(PyObject *o)¶
- Возвращаемое значение: новая ссылка.
Возвращает следующее значение из итерации o. Если объект является итератором, извлекает следующее значение из итерации и возвращает NULL без установленного исключения, если не осталось элементов. Если объект не является итератором, возбуждается TypeError, или, если при извлечении элемента произошла ошибка, возвращает 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 {
/* продолжить выполнение полезной работы */
}