如何在swig C++代码中抛出StopIteration?
我正在尝试通过在一个类中实现 Python 的迭代协议来扩展一个 C++ 库。问题是,当我在 next() 方法中试图抛出一个 StopIteration 异常时,程序就出现了段错误(SegFault)。我在 C++ 代码中抛出这个异常的方法(在 python.i 文件里)是这里描述的:http://www.swig.org/Doc1.3/Python.html#Python_nn44
虽然那个列表没有列出 StopIteration 异常,但这是我尝试过的:
PyErr_SetString(PyExc_StopIteration, NULL);
2 个回答
1
这个段错误(segfault)几乎肯定是因为你传给了 PyErr_SetString
一个空指针(NULL pointer)。你可以试试下面的方法:
PyErr_SetString(PyExc_StopIteration, "end of collection");
补充 我刚刚看到一个非常不错的帖子,你可能会觉得有用: 如何使用Python C API创建生成器/迭代器?
5
所以正确的答案是,next() 方法必须返回一个 PyObject*,并且还要使用 SetNone。它的写法应该是这样的:
PyObject* next(PyObject* self) {
if (i < n) {
\\ go on iterating
} else {
PyErr_SetNone(PyExc_StopIteration);
return NULL;
}
}
感谢 aix 提供的链接!