Pybind11如何为参数为结构体的函数创建Python绑定?
问题原因
你的C++绑定代码本身没有逻辑错误,报错来自Python侧的调用错误:你没有实例化Config结构体对象,而是直接将Config类本身作为参数传入了函数。
你写的config = example.Config只是将类对象赋值给变量,并未创建实例,因此传入myfunction时类型不匹配。
修复方案
1. 直接修正Python调用代码
只需在获取Config时添加括号调用默认构造函数即可:
import example # 加括号实例化Config对象 config = example.Config() config.a = 1 config.b = 2 example.myfunction(config)
2. 可选:优化绑定代码提升易用性
如果希望Python侧可以更方便的初始化Config对象,比如支持关键字参数、初始化时直接传值,可以修改绑定代码添加构造函数绑定:
PYBIND11_MODULE(example, m) { py::class_<Config>(m, "Config") // 绑定默认构造函数 .def(py::init<>()) // 绑定带参数的构造函数,指定参数名支持关键字传参 .def(py::init<int, int>(), py::arg("a"), py::arg("b")) .def_readwrite("a", &Config::a) .def_readwrite("b", &Config::b); // 给函数也加参数名提升Python侧提示体验 m.def("myfunction", &myfunction, py::arg("config")); }
优化后Python侧可以直接这样初始化,代码更简洁:
config = example.Config(a=1, b=2) example.myfunction(config=config)
内容的提问来源于stack exchange,提问作者user3667089
相关产品推荐
相关产品推荐

