Pybind11如何为结构体成员变量设置默认值?
解决方案
错误原因
def_readwrite 是 Pybind11 提供的用于暴露类/结构体公共成员变量读写权限的接口,它的入参不支持 py::arg 语法配置默认值:def_readwrite 第三个及之后的参数只会被识别为文档字符串,你的写法不符合接口定义,因此编译报错。
结构体成员的默认值属于实例构造阶段的初始化逻辑,需要在绑定构造函数时配置。
正确实现方式
你只需要为绑定的 example 类显式声明带默认参数的构造函数即可,C++ 结构体自带的默认成员初始化规则会自动生效,绑定代码如下:
PYBIND11_MODULE(example_python, m) { py::class_<example>(m, "example") // 绑定构造函数,配置参数默认值 .def(py::init<int, int>(), py::arg("a") = 1, py::arg("b") = 2) // 保留成员变量的读写权限绑定 .def_readwrite("a", &example::a) .def_readwrite("b", &example::b); }
如果你的编译环境不支持C++17及以上的聚合初始化自动匹配,可以改用lambda实现构造逻辑:
PYBIND11_MODULE(example_python, m) { py::class_<example>(m, "example") .def(py::init([](int a = 1, int b = 2) { example ins; ins.a = a; ins.b = b; return ins; }), py::arg("a") = 1, py::arg("b") = 2) .def_readwrite("a", &example::a) .def_readwrite("b", &example::b); }
Python侧测试效果
配置完成后你在Python中可以按如下方式使用,默认值会正常生效:
import example_python # 无参构造,a=1,b=2 ins1 = example_python.example() # 仅传a,a=10,b=2 ins2 = example_python.example(a=10) # 传两个参数,a=10,b=20 ins3 = example_python.example(10, 20)
内容的提问来源于stack exchange,提问作者user3667089
相关产品推荐
相关产品推荐

