如何从swig C ++代码中提高StopIteration?

时间:2011-09-19 15:09:24

标签: c++ python swig

我正在尝试通过在类上实现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 个答案:

答案 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?