如何通过SWIG实现C++ enum class转为Python风格枚举访问?
如何让SWIG生成的C++枚举类支持Python原生枚举风格访问
默认情况下,SWIG处理C++的enum class时,会直接把枚举值暴露在模块的根命名空间下,就像你遇到的impl.RED这种方式,没法用Python原生枚举那样的层级访问。不过我们可以通过SWIG的特性来解决这个问题,让生成的Python接口和原生枚举用法一致。
方法:使用SWIG的%feature("python:enum")指令
修改你的SWIG接口文件,添加%feature("python:enum")来指定要转成Python Enum类的C++枚举:
%module api %{ #include "example.h" %} // 配置SWIG将colors::Color转换成Python Enum子类 %feature("python:enum") colors::Color; %include "example.h"
重新用SWIG生成接口文件并编译后,你就能像使用Python原生枚举一样访问了:
import api # 直接访问枚举成员 print(api.Color.RED) # 获取枚举值 print(api.Color.RED.value) # 也可以通过值反向查找枚举 print(api.Color(0)) # 输出 <Color.RED: 0>
注意事项
- 这个特性需要SWIG 3.0及以上版本的支持,如果你用的是老版本,可能需要先升级SWIG。
- 如果你还有其他枚举类需要处理,只需要给每个枚举类添加对应的
%feature("python:enum")行即可。
内容的提问来源于stack exchange,提问作者Arslan
相关产品推荐
相关产品推荐

