You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 05:48:41