如何通过pybind11在Python中正确使用C++导出的std::map
问题成因
报错核心原因是Python侧代码未对绑定的MyMap_t类型做实例化,直接将类对象当作map实例操作。
你打印输出的<class 'ModuleCpp.MyMap_t'>已经明确说明mm变量存储的是类型本身,而非实际的C++ map容器实例。这个逻辑和直接写dict[1] = "Hello"触发同类错误一致:Python原生类型也不支持直接对类对象做下标赋值。
你C代码中标记的PYBIND11_MAKE_OPAQUE( MyMap_t )并非无效,它的作用是告知pybind11不要将std::map<int, std::string>默认转换为Python原生dict,而是保留C侧map类型暴露给Python,和py::bind_map的用法是匹配的,这部分绑定逻辑没有错误。
正确使用方式
使用绑定类型前先加括号完成实例化,再执行各类容器操作即可。修正后的Python测试代码如下:
import ModuleCpp if __name__ == "__main__": # 加()调用类,生成map实例 mm = ModuleCpp.MyMap_t() print(mm) # 下标赋值可正常执行 mm[1] = "Hello" mm[2] = "World" # 支持常规类Python dict的操作 print(mm[1]) # 输出: Hello print(len(mm)) # 输出: 2 print(1 in mm) # 输出: True del mm[1] # 删除指定键值对 # 支持遍历 for k, v in mm.items(): print(k, v) # 输出: 2 World # 可直接转换为Python原生dict native_py_dict = dict(mm)
通过py::bind_map绑定的std::map,默认支持以下Python风格的容器操作:
- 下标读写:
m[key]读取值、m[key] = val写入值 - 长度查询:
len(m)获取元素个数 - 成员判断:
key in m判断键是否存在 - 元素删除:
del m[key]删除指定键对应的键值对 - 遍历接口:支持
keys()、values()、items()三类遍历方法 - 类型互转:可直接传入
dict()构造函数转换为Python原生字典
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

