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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:36:01