2013-05-09 13 views
8

Ich habe eine einfache Enum in C in myenum.h:Wrapping C-Enumeration in einem Python-Modul mit Swig

enum MyEnum { 
    ONE, 
    TWO, 
    THREE 
}; 

Das Problem, das ist, wenn ich das Python Karte, ich nur die Enum zugreifen kann durch der Modulname, nicht über MyEnum. Daher sind die Werte EINS, ZWEI, DREI in allen anderen Funktionen enthalten, die ich definiere, anstatt mit MyEnum enthalten zu sein.

Meine api.i Datei ist:

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

I erzeugen mit SWIG

swig -builtin -python api.i 

Und importieren Sie es in Python

import _api 

Und jetzt muss ich die ENUM-Werte verwenden aus dem _api-Modul:

_api.ONE 
_api.TWO 
_api.THREE 

Während ich sie wie

_api.MyEnum.ONE 
_api.MyEnum.TWO 
_api.MyEnum.THREE 
verwenden möchten

Wer weiß, wie ich dies erreichen kann?

+4

Thd _api-Modul ist privat. Sie sollten es nicht direkt verwenden. – Flexo

Antwort

1

Es gibt eine SWIG-Funktion nspace, die Sie wollen, aber leider wird es für Python noch nicht unterstützt. Ich musste das Enum immer in einer Struktur definieren, damit es in der von SWIG gewünschten Weise angezeigt wird. Beispiel:

%module tmp 

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

Ergebnis:

>>> import tmp 
>>> tmp.MyEnum.A 
0 
>>> tmp.MyEnum.B 
1 
>>> tmp.MyEnum.C 
2 
1

Was müssen Sie verstehen, ist, dass in C diese Namen in Ihrem Enum nicht Namensraum, wie sie in Python wäre. Sie sollten wahrscheinlich etwas darüber lesen, wie enums can be used bevor Sie fortfahren.

Nun beachten Sie, dass diese Namen in Python nicht benannt werden, da es sich um global zugängliche Namen handelt. Ihre beste Wette ist ein Objekt, in diese Richtung zu schaffen:

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

del(A, B, C) 

Dann A, B, C wird nur zugänglich sein durch _api.MyEnum.A etc. und A, B, C nicht direkt zugänglich sein.