迭代器協議?

迭代器有兩個函數。

int PyIter_Check(PyObject?*o)?

返回 true , 如果對象 o?支持迭代器協議的話。

PyObject* PyIter_Next(PyObject?*o)?
Return value: New reference.

返回迭代 o 的下一個值。 對象必須是一個迭代器(這應由調用者來判斷)。 如果沒有余下的值,則返回 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 */
}