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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:25:25