# 疊代器協議

有兩個專門用於疊代器的函式。

int PyIter_Check(PyObject *o)
  為 穩定 ABI 的一部分 自 3.8 版本開始.

  如果物件 o 可以安全地傳遞給 `PyIter_Next()` 則回傳非零 (non-zero)，否則回傳 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()` 不同結果的列舉 (enum) 值。

  在 3.10 版被加入.

PySendResult PyIter_Send(PyObject *iter, PyObject *arg, PyObject **presult)
  為 穩定 ABI 的一部分 自 3.10 版本開始.

  將 arg 值發送到疊代器 iter 中。回傳：

  - 如果疊代器有回傳則為 `PYGEN_RETURN`。回傳值透過 presult 回傳。

  - 如果疊代器有產生 (yield) 則為 `PYGEN_NEXT`。產生值透過 presult 回傳。

  - 如果疊代器引發例外則為 `PYGEN_ERROR`。 presult 被設定為 `NULL`。

  在 3.10 版被加入.