SWIG-转换为C++;枚举到Python枚举 我正在使用SWIG获得C++类枚举到Python枚举。我在example.h文件中有以下实现。 namespace colors{ enum class Color{ RED = 0, BLUE = 1, GREEN = 2 }; }
我的Swig接口文件是SWIG-转换为C++;枚举到Python枚举 我正在使用SWIG获得C++类枚举到Python枚举。我在example.h文件中有以下实现。 namespace colors{ enum class Color{ RED = 0, BLUE = 1, GREEN = 2 }; },python,c++,enums,swig,Python,C++,Enums,Swig,我的Swig接口文件是 %module api %{ #include "example.h" %} %include "example.h" 但是在使用swig工具之后,该接口提供了以下用法 import pywarp_example as impl impl.RED 这里出现的问题是,是否可以像下面这样访问enum?这是我们在python中使用的方式 impl.Color.RED Or impl.Color.RED.value 与示例不同,SWIG 3.0.12将enum类示
%module api
%{
#include "example.h"
%}
%include "example.h"
但是在使用swig工具之后,该接口提供了以下用法
import pywarp_example as impl
impl.RED
这里出现的问题是,是否可以像下面这样访问enum?这是我们在python中使用的方式
impl.Color.RED Or impl.Color.RED.value
与示例不同,SWIG 3.0.12将
enum类
示例包装为Color\u RED
、Color\u BLUE
和Color\u GREEN
。下面的示例添加了一些额外的Python代码,以将该模式重新映射到Color.RED
、Color.BLUE
和Color.GREEN
:
%pythoncode
被添加到SWIG包装的Python部分。Python扩展加载后,此代码将运行。它收集和删除以前缀开头的变量,重命名它们而不使用前缀,然后创建一个名为前缀的类,将新变量作为类变量
%module test
%inline %{
namespace colors{
enum class Color{
RED = 0,
BLUE = 1,
GREEN = 2
};
}
%}
%pythoncode %{
from enum import Enum
def redo(prefix):
tmpD = {k:v for k,v in globals().items() if k.startswith(prefix + '_')}
for k,v in tmpD.items():
del globals()[k]
tmpD = {k[len(prefix)+1:]:v for k,v in tmpD.items()}
# globals()[prefix] = type(prefix,(),tmpD) # pre-Enum support
globals()[prefix] = Enum(prefix,tmpD)
redo('Color')
del redo # cleaning up the namespace
del Enum
%}
示例用法:
>>> import test
>>> dir(test)
['Color', '__builtin__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_newclass', '_object', '_swig_getattr', '_swig_property', '_swig_repr', '_swig_setattr', '_swig_setattr_nondynamic', '_test']
>>> test.Color
<enum 'Color'>
>>> dir(test.Color)
['BLUE', 'GREEN', 'RED', '__class__', '__doc__', '__members__', '__module__']
>>> test.Color.BLUE
<Color.BLUE: 1>
导入测试
>>>主任(测试)
“颜色”方面的“颜色”方面的“颜色”方面的“颜色”方面的“颜色”方面的“颜色”方面的,“颜色”方面的“颜色”方面的,“颜色”方面的“颜色”方面的“颜色”方面的,“颜色”方面的“颜色”方面的“颜色”方面的“颜色”方面的“颜色”方面的“颜色”方面的“颜色”方面的“颜色”方面的,“颜色”方面的“颜色”方面的“颜色”方面的缓存方面的“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU“,”u测试“]
>>>测试。颜色
>>>目录(测试颜色)
[“蓝色”、“绿色”、“红色”、“类”、“文档”、“成员”、“模块”]
>>>测试颜色
C++枚举可以使用此脚本转换为python枚举。
%pythoncode %{
from enum import Enum
def enum(prefix):
tmpD = {k:v for k,v in globals().items() if k.startswith(prefix + '_')}
for k,v in tmpD.items():
del globals()[k]
tmpD = {k[len(prefix)+1:]:v for k,v in tmpD.items()}
globals()[prefix] = Enum(prefix,tmpD)
%}
SWIG比Python
enum
s早了很多。在您这样做之前,维护人员必须添加对enum
s的支持。据我所知,这还没有发生。谢谢,我希望这个支持尽快添加:)我不久前发布了另一个相关的解决方案:感谢Flexo提供的另一个解决方案谢谢Mark,非常感谢,有没有办法创建python枚举而不是类。我将enum替换为IntEnum,以允许将其用作函数参数