首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pybind11混合类型转换和不透明类型

使用pybind11混合类型转换和不透明类型
EN

Stack Overflow用户
提问于 2019-09-30 22:20:32
回答 2查看 680关注 0票数 2

我在pybind11中使用了不透明类型。例如,我为FromVec方法的参数类型stl容器std::vector<uint32_t>定义了一个

代码语言:javascript
复制
void FromVec(std::vector<uint32_t> vec);

PYBIND11_MAKE_OPAQUE(std::vector<uint32_t>);

PYBIND11_MODULE(tmap, m)
{
    py::bind_vector<std::vector<uint32_t>>(m, "VectorUint", 
      "Unsigned 32-bit int vector.");

    m.def("from_vec", &FromVec, py::arg("vec")
}

有了这个,我现在可以(在Python中)执行以下操作:

代码语言:javascript
复制
vec = VectorUint([2, 66, 262, 662, 26, 62])
from_vec(vec)

但是,类型转换不再起作用,因为该函数现在需要一个VectorUint,不再接受list,例如:

代码语言:javascript
复制
l = [2, 66, 262, 662, 26, 62]
from_vec(l)

有没有一种方法可以同时支持间接类型和类型转换?也就是说,当传递list而不是间接绑定的VectorUint时,它会被转换为std::vector<uint32_t>,而不是Python抛出“不兼容的函数参数”?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-01 05:42:47

如果你需要从list自动转换成std::vector,你可以在你的绑定代码中添加这样的重载:

代码语言:javascript
复制
m.def("from_vec", &FromVec, py::arg("vec")); // accepts VectorUnit 
m.def("from_vec", [](py::list& list){ /* do conversion manually and call FromVec */ } ); // accepts python list
票数 3
EN

Stack Overflow用户

发布于 2020-03-19 01:02:09

只需在您的py::bind_vector后面添加以下内容

代码语言:javascript
复制
py::implicitly_convertible<py::list, std::vector<uint32_t>>();

它甚至可以处理属性(例如用def_readwrite创建的属性)。您可以两全其美:向量是通过引用从python访问的,因此appendextend等可以按预期工作;您可以从python列表中赋值(当然会被复制)。

编辑:不幸的是,这个技巧不适用于std::map (不知道其他容器)。作为一种解决办法,您可以使用不同类型的中间映射,例如:

代码语言:javascript
复制
namespace pybind11::workaround
{
  template<typename K, typename V>
  class Map : public std::map<K, V> {};
}

namespace pybind11::detail
{
  template<typename K, typename V>
  struct type_caster<workaround::Map<K, V>> : map_caster<workaround::Map<K, V>, K, V> {};
}

inline void bindCommonTypes(pybind11::handle scope)
{
  using IntMap = std::map<int, int>;
  py::bind_map<IntMap>(scope, "IntMap")
  .def(py::init([](const py::dict& dict) {
    return dict.cast<pybind11::workaround::Map<int, int>();
  }));
  py::implicitly_convertible<py::dict, IntMap>();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58169847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档