SWIG-转换为C++;枚举到Python枚举 我正在使用SWIG获得C++类枚举到Python枚举。我在example.h文件中有以下实现。 namespace colors{ enum class Color{ RED = 0, BLUE = 1, GREEN = 2 }; }

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类示

我的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类
示例包装为
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,以允许将其用作函数参数