pybind11中实现动态返回不同类型函数的导出方法
实现方案
这个需求完全可实现,你代码里占位的/* something */就是pybind11提供的py::cast模板函数。
py::cast可以将pybind11默认支持转换的基础类型、以及你已经通过py::class_注册过的自定义C++类型,统一转换为通用的py::object实例,Python侧调用时会自动识别为对应的原生Python类型,自动处理引用计数。
完整可运行示例
绑定代码如下:
#include <pybind11/pybind11.h> namespace py = pybind11; PYBIND11_MODULE(example, m) { m.def("func", [](bool b) -> py::object { if(b) { // C++ int 转换后对应Python int类型 return py::cast(42); } else { // C++ 字符串转换后对应Python str类型 return py::cast("hello"); } }); }
编译为Python模块后,调用行为和你给出的原生Python示例完全一致:
import example print(type(example.func(True)), example.func(True)) # <class 'int'> 42 print(type(example.func(False)), example.func(False)) # <class 'str'> hello
注意事项
- 禁止直接将C++原生值赋值给
py::object变量,必须显式调用py::cast完成转换,否则会触发编译报错。 - 如果需要返回Python的
None,直接返回py::none()即可,该对象本身就是py::object的合法实例。 - 自定义C++类型必须提前通过
py::class_完成导出注册,py::cast才能找到对应的转换逻辑完成封装。
内容的提问来源于stack exchange,提问作者Nicola Gigante
相关产品推荐
相关产品推荐

