我正在尝试通过在类上实现python迭代协议来扩展C ++库。问题是尝试从next()方法引发StopIteration异常会使程序成为SegFault。我用来从C ++代码(在python.i中)引发异常的方法是这里描述的方法:http://www.swig.org/Doc1.3/Python.html#Python_nn44
虽然该列表没有列出StopIteration异常,但这是我尝试过的:
PyErr_SetString(PyExc_StopIteration, NULL);
答案 0 :(得分:4)
所以正确的答案似乎是next()方法必须返回PyObject *并且还使用SetNone。所以它看起来像这样:
PyObject* next(PyObject* self) {
if (i < n) {
\\ go on iterating
} else {
PyErr_SetNone(PyExc_StopIteration);
return NULL;
}
}
感谢aix的链接!
答案 1 :(得分:1)
段错误几乎肯定是由您传递给PyErr_SetString
的NULL指针引起的。请尝试以下方法:
PyErr_SetString(PyExc_StopIteration, "end of collection");
修改我刚刚看到以下优秀文章,您可能会觉得有用:How to create a generator/iterator with the Python C API?