이터레이터 프로토콜
*******************

특히 이터레이터를 사용하기 위한 두 함수가 있습니다.

int PyIter_Check(PyObject *o)
    * Part of the Stable ABI since version 3.8.*

   객체 *o*가 "PyIter_Next()"에 안전하게 전달될 수 있으면 "0"이 아닌
   값을, 그렇지 않으면 "0"을 돌려줍니다. 이 함수는 항상 성공합니다.

int PyAIter_Check(PyObject *o)
    * Part of the Stable ABI since version 3.10.*

   객체 *o*가 "AsyncIterator" 프로토콜을 지원하면 "0"이 아닌 값을, 그
   렇지 않으면 "0"을 돌려줍니다. 이 함수는 항상 성공합니다.

   버전 3.10에 추가.

PyObject *PyIter_Next(PyObject *o)
    *반환값: 새 참조.** Part of the Stable 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

   The enum value used to represent different results of
   "PyIter_Send()".

   버전 3.10에 추가.

PySendResult PyIter_Send(PyObject *iter, PyObject *arg, PyObject **presult)
    * Part of the Stable ABI since version 3.10.*

   Sends the *arg* value into the iterator *iter*. Returns:

   * "PYGEN_RETURN" if iterator returns. Return value is returned via
     *presult*.

   * "PYGEN_NEXT" if iterator yields. Yielded value is returned via
     *presult*.

   * "PYGEN_ERROR" if iterator has raised and exception. *presult* is
     set to "NULL".

   버전 3.10에 추가.
