我正在为一个元组类编写一个pybind11 Package 器,我希望它有__iter__
方法。
为此,我将“tuple”字段转换为变量向量,并如下定义"__iter__"
:
cls.def(
"__iter__",
[](const MyTuple& t){
// some metaprogramming to get the underlying types of MyTuple
using my_variant = std::variant<...>;
std::vector<my_variant> fields; // local!
fill(fields); // fill with t's fields converted to my_variant
return py::make_iterator(begin(fields), end(fields));
},
py::keep_alive<0, 1>()
);
当然,这是一个坏主意,因为fields
一旦超出范围就会死亡。
除了为MyTuple
定义一个定制的保持器(它将封装这个向量)之外,是否有一个简单的技巧可以将这个辅助向量的所有权传递给pybind11?
如果我定义了一个自定义保持器,是否可以从py::class_
访问它?
1条答案
按热度按时间wrrgggsh1#
如果你的元组类可以和
std::apply
一起使用(或者你可以做类似的事情),你可以简单地创建一个Python元组并返回它的迭代器:你也可以创建一个自定义迭代器,例如。
然后您可以简单地:
第二个版本的优点是不复制对象。