迭代器协议¶
迭代器有两个函数。
-
int
PyIter_Check
(PyObject *o)¶ - Part of the Stable ABI since version 3.8.
Return non-zero if the object o can be safely passed to
PyIter_Next()
, and0
otherwise. This function always succeeds.
-
int
PyAIter_Check
(PyObject *o)¶ - Part of the Stable ABI since version 3.10.
如果对象 'obj' 提供了
AsyncIterator
协议则返回非零值,否则返回0
。 此函数总是会成功执行。3.10 新版功能.
-
PyObject *
PyIter_Next
(PyObject *o)¶ - Return value: New reference. Part of the Stable ABI.
Return the next value from the iterator o. The object must be an iterator according to
PyIter_Check()
(it is up to the caller to check this). If there are no remaining values, returnsNULL
with no exception set. If an error occurs while retrieving the item, returnsNULL
and passes along the exception.
要为迭代器编写一个一个循环,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()
的不同结果的枚举值。3.10 新版功能.
-
PySendResult
PyIter_Send
(PyObject *iter, PyObject *arg, PyObject **presult)¶ - Part of the Stable ABI since version 3.10.
将 arg 值发送到迭代器 iter。 返回:
PYGEN_RETURN
,如果迭代器返回的话。 返回值会通过 presult 来返回。PYGEN_NEXT
,如果迭代器生成值的话。 生成的值会通过 presult 来返回。PYGEN_ERROR
,如果迭代器引发异常的话。 presult 会被设为NULL
。
3.10 新版功能.