2013-05-09 77 views
8

一個Python模塊在我有一個簡單枚舉關於C中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 -builtin -python api.i 

,並將其導入的Python

import _api 

而現在我必須用枚舉值來自_api模塊:

_api.ONE 
_api.TWO 
_api.THREE 

雖然我想使用它們像

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

有誰知道我能做到這一點?

+4

Thd _api模塊是私有的。你不應該直接使用它。 – Flexo 2013-05-10 16:11:40

回答

1

有一個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 
1

你需要了解什麼是在C中的枚舉那些名字沒有命名空間,因爲他們會在Python。您應該在繼續之前閱讀關於如何enums can be used的內容。

現在請注意,由於這些名稱是全局可訪問的名稱,因此它們不會在Python中使用名稱空間。最好的辦法,就是創建一個對象,沿着這些線路:

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

del(A, B, C) 

然後A,B,C將只能訪問經過_api.MyEnum.A等,而A,B,C將無法直接訪問。