如何在swig C++代码中抛出StopIteration?

3 投票
2 回答
1242 浏览
提问于 2025-04-17 02:36

我正在尝试通过在一个类中实现 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 提供的链接!

撰写回答