首页 > 解决方案 > 如何将 pybind11::keep_alive 与返回不同类型对象的函数一起使用

问题描述

我有一些类似的代码:

struct A {
  std::vector<int> x;
  int y;
};

PYBIND11_MODULE(example, m) {

  py::class<A>(m, "A").def(
      "__getitem__",
      [](A& a, int64_t i) -> py::object {
        switch (i) {
          case 0: return py::array_t(a.x.size(), a.x.data());
          case 1: return py::cast(a.y);
          default: throw py::index_error("index out of range");
        }
      },
      py::keep_alive<0, 1>{});

}

从 python调用a[0]按预期工作。a[1]失败RuntimeError: Could not allocate weak reference!,我认为是因为将 int 对象分配为护士没有意义。

在保持对活动的引用的同时处理两个索引的推荐方法是什么A?(显然,如果返回的对象是一个 int,则不需要让它保持活动状态,但对于 numpy 数组来说就是如此。)

标签: pythonc++pybind11python-extensions

解决方案


推荐阅读