迭代器协议

有两个专门用于处理迭代器的函数。

int PyIter_Check(PyObject *o)
自 3.8 版本以来,作为稳定 ABI 的一部分。

如果对象 o 可以安全地传递给 PyIter_NextItem(),则返回非零值;否则返回 0。此函数总是成功的。

int PyAIter_Check(PyObject *o)
自 3.10 版本以来,作为 稳定 ABI 的一部分。

如果对象 o 提供了 AsyncIterator 协议,则返回非零值;否则返回 0。此函数总是成功的。

在 3.10 版本加入。

int PyIter_NextItem(PyObject *iter, PyObject **item)
自 3.14 版本以来,作为 稳定 ABI 的一部分。

成功时返回 1 并将 item 设置为迭代器 iter 的下一个值的强引用。如果没有剩余的值,则返回 0 并将 item 设置为 NULL。如果发生错误,则返回 -1,将 item 设置为 NULL 并设置一个异常。

在 3.14 版本加入。

PyObject *PyIter_Next(PyObject *o)
返回值: 新引用。 稳定ABI 的一部分。

这是 PyIter_NextItem() 的旧版本,为了向后兼容而保留。请优先使用 PyIter_NextItem()

返回迭代器 o 的下一个值。根据 PyIter_Check(),该对象必须是一个迭代器(由调用者负责检查)。如果没有剩余的值,则返回 NULL 且不设置异常。如果在获取项时发生错误,则返回 NULL 并传递异常。

type PySendResult

用于表示 PyIter_Send() 不同结果的枚举值。

在 3.10 版本加入。

PySendResult PyIter_Send(PyObject *iter, PyObject *arg, PyObject **presult)
自 3.10 版本以来,作为 稳定 ABI 的一部分。

arg 值发送到迭代器 iter 中。返回

  • 如果迭代器返回,则为 PYGEN_RETURN。返回值通过 presult 返回。

  • 如果迭代器生成值,则为 PYGEN_NEXT。生成的值通过 presult 返回。

  • 如果迭代器引发异常,则为 PYGEN_ERRORpresult 设置为 NULL

在 3.10 版本加入。