疊代器協議

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

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

如果物件o 可以安全地傳遞給PyIter_Next() 則回傳非零 (non-zero),否則回傳 0。這個函式一定會執行成功。

intPyAIter_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 */}
typePySendResult

用於表示PyIter_Send() 不同結果的列舉 (enum) 值。

在 3.10 版被加入.

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

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

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

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

  • 如果疊代器引發例外則為PYGEN_ERRORpresult 被設定為NULL

在 3.10 版被加入.