如何为Pybind11创建的Python枚举支持len()方法
解决Pybind11绑定C++枚举后无法调用
len(Kind)的问题 问题根源
你之前绑定的__len__是枚举实例的方法,仅对Kind.Kind1这类枚举值调用len()时生效;而len(Kind)是对枚举类本身调用,需要给枚举的类型对象绑定对应的__len__方法。
修复代码
在绑定__len__时添加py::type_修饰符,明确将方法绑定到枚举类对象上,而非枚举实例:
py::enum_<Kind>(py_module, "Kind") .value("Kind1", Kind::Kind1) .value("Kind2", Kind::Kind2) .value("Kind3", Kind::Kind3) .def("__len__", []() { return 3; }, py::type_); // 核心:py::type_ 指定方法属于枚举类本身
验证效果
重新编译后,在Python环境中调用len(Kind)会返回3,和原生Python Enum的行为完全一致。
可选优化(避免硬编码)
如果枚举成员可能变动,不想硬编码数字,可以在C++中提前定义同步的常量,或者用编译期逻辑计算成员数量(简单场景下直接维护常量更直观):
// 在C++代码中定义枚举成员数常量 constexpr size_t Kind_Member_Count = 3; // 绑定时代入常量 .def("__len__", []() { return Kind_Member_Count; }, py::type_)
内容的提问来源于stack exchange,提问作者TonySalimi
相关产品推荐
相关产品推荐

