9

我在 myenum.h 中有一个简单的 C 枚举:

enum MyEnum {
    ONE,
    TWO,
    THREE
};

问题是当我将它映射到 Python 时,我只能通过模块名称访问枚举,而不是通过 MyEnum。所以值 ONE、TWO、THREE 包含在我定义的任何其他函数中,而不是包含在 MyEnum 中。

我的 api.i 文件是:

%module api
%{
#include "myenum.h"
%}
%include "myenum.h"

我用 SWIG 生成

swig -builtin -python api.i

并将其导入 Python

import _api

现在我必须使用 _api 模块中的枚举值:

_api.ONE
_api.TWO
_api.THREE

虽然我想像使用它们一样

_api.MyEnum.ONE
_api.MyEnum.TWO
_api.MyEnum.THREE

有谁知道我怎么能做到这一点?

4

2 回答 2

2

有一个 SWIG 功能nspace确实需要你想要的,但不幸的是 Python 还不支持它。我一直必须在结构中定义枚举,以便它以您在 SWIG 中想要的方式显示。例子:

%module tmp

%inline %{
struct MyEnum {
    enum { A,B,C };
};
%}

结果:

>>> import tmp
>>> tmp.MyEnum.A
0
>>> tmp.MyEnum.B
1
>>> tmp.MyEnum.C
2
于 2013-05-12T00:07:24.453 回答
1

您需要了解的是,在 C 中,枚举中的这些名称不像在 Python 中那样具有命名空间。在继续之前,您可能应该阅读有关如何使用枚举的内容。

现在请注意,由于这些是全局可访问的名称,因此它们不会在 Python 中命名。您最好的选择是按照以下方式创建一个对象:

class MyEnum:
   A = A
   B = B
   C = C

del(A, B, C)

那么 A、B、C 将只能通过_api.MyEnum.A等访问,而 A、B、C 将无法直接访问。

于 2013-05-12T00:55:12.820 回答