pybind11 相当于 boost::python::extract?

Posted

技术标签:

【中文标题】pybind11 相当于 boost::python::extract?【英文标题】:pybind11 equivalent of boost::python::extract? 【发布时间】:2016-11-04 13:00:04 【问题描述】:

我正在考虑将复杂代码从 boost::python 移植到 pybind11,但我对缺少 boost::python::extract<...>().check() 之类的东西感到困惑。我读到pybind11::cast<T> 可用于从py::object 中提取c++ 对象,但检查转换是否可能的唯一方法是调用它并在转换失败时捕获异常。有什么我忽略的吗?

【问题讨论】:

【参考方案1】:

isinstance 将完成这项工作 (doc):

namespace py = pybind11;
py::object  obj =  ...
if (py::isinstance<py::array_t<double>>(obj))

    ....
 
else if (py::isinstance<py::str>(obj))

   std::string val = obj.cast<std::string>();
   std::cout << val  << std::endl;
 
else if (py::isinstance<py::list>(obj))  

   ...
  

【讨论】:

后续问题:如何使用它来测试对象是否是我的一个类的 Python 表示(通过 pybind11 暴露给 Python)? @LarryGritz 同上:py::isinstance&lt;MyCustomClass&gt;(obj).

以上是关于pybind11 相当于 boost::python::extract?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 dict 和 pybind11

from _dlib_pybind11 import * ModuleNotFoundError: No module named '_dlib_pybind11'

如何将浮点数传递给期望 int 的 pybind11 函数

返回多个 py::array 而不在 pybind11 中复制

使用 Pybind11 包装 STL 容器返回类型

如何通过pybind11在python中捕获C++的异常?