이터레이터 프로토콜

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

int PyIter_Check(PyObject *o)

객체 o가 이터레이터 프로토콜을 지원하면 참을 돌려줍니다. 이 함수는 항상 성공합니다.

PyObject* PyIter_Next(PyObject *o)
Return value: New reference.

이터레이션 o에서 다음 값을 반환합니다. 객체는 이터레이터 여야 합니다 (이것을 확인하는 것은 호출자 책임입니다). 남은 값이 없으면, 예외가 설정되지 않은 상태로 NULL을 반환합니다. 항목을 꺼내는 동안 에러가 발생하면, NULL을 반환하고 예외를 전달합니다.

이터레이터를 이터레이트하는 루프를 작성하려면, C 코드는 이런 식으로 되어야 합니다:

PyObject *iterator = PyObject_GetIter(obj);
PyObject *item;

if (iterator == NULL) {
    /* 에러를 전파합니다 */
}

while ((item = PyIter_Next(iterator))) {
    /* item으로 뭔가 합니다 */
    ...
    /* 끝나면 참조를 반환합니다 */
    Py_DECREF(item);
}

Py_DECREF(iterator);

if (PyErr_Occurred()) {
    /* 에러를 전파합니다 */
}
else {
    /* 쓸모있는 일을 계속합니다 */
}