2011-09-19 37 views

回答

4

所以正確的答案似乎是下一個()方法必須返回一個PyObject *並使用SetNone。所以它看起來像這樣:

PyObject* next(PyObject* self) { 
    if (i < n) { 
     \\ go on iterating 
    } else { 
     PyErr_SetNone(PyExc_StopIteration); 
     return NULL; 
    } 
} 

感謝aix的鏈接!

1

段錯誤幾乎肯定是由您傳遞給PyErr_SetString的NULL指針造成的。請嘗試以下操作來代替:

PyErr_SetString(PyExc_StopIteration, "end of collection"); 

編輯我剛剛遇到以下優良後,你可能會發現有用:How to create a generator/iterator with the Python C API?

+0

是的。這似乎並沒有被Python解釋器識別爲StopIteration異常。它不會退出循環,而是永遠持續下去。我認爲這可能不是提升錯誤的正確機制?代碼只是似乎將該消息發送到stderr,但沒有引發python異常... – Oin

+0

@mapleoin:看看http://stackoverflow.com/questions/1815812/how-to-create-a-generator-迭代器與python-c-api/1816961#1816961如果你還沒有。 – NPE