【问题标题】:How to raise StopIteration from swig C++ code?如何从 swig C++ 代码中引发 StopIteration?
【发布时间】:2011-11-20 08:18:31
【问题描述】:

我正在尝试通过在类上实现 python 迭代协议来扩展 C++ 库。问题是试图从 next() 方法引发 StopIteration 异常会使程序出现 SegFault。我用来从 C++ 代码(在 python.i 中)引发异常的方法是这里描述的方法:http://www.swig.org/Doc1.3/Python.html#Python_nn44

虽然该列表没有列出 StopIteration 异常,但这是我尝试过的:

PyErr_SetString(PyExc_StopIteration, NULL);

【问题讨论】:

    标签: c++ python swig


    【解决方案1】:

    所以正确的答案似乎是 next() 方法必须返回一个 PyObject* 并且还使用 SetNone。所以它看起来像这样:

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

    感谢 aix 提供链接!

    【讨论】:

      【解决方案2】:

      段错误几乎肯定是由您传递给PyErr_SetString 的NULL 指针引起的。请尝试以下方法:

      PyErr_SetString(PyExc_StopIteration, "end of collection");
      

      编辑我刚刚看到以下出色的帖子,您可能会觉得它很有用:How to create a generator/iterator with the Python C API?

      【讨论】:

      • 是的。 python 解释器似乎没有将其识别为 StopIteration 异常。它不会退出循环,它只会永远持续下去。我认为这可能根本不是引发错误的正确机制?该代码似乎只是将该消息发送到 stderr,但没有引发 python 异常...
      • @mapleoin:如果您还没有,请查看stackoverflow.com/questions/1815812/…
      猜你喜欢
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多