2013-05-09 20 views
8

Ho una semplice enum in C in myenum.h:Wrapping C-enum in un modulo Python con Swig

enum MyEnum { 
    ONE, 
    TWO, 
    THREE 
}; 

Il problema è che quando mappare questo a Python, posso accedere solo attraverso l'enumerazione il nome del modulo, non tramite MyEnum. Quindi i valori ONE, TWO, THREE sono inclusi in tutte le altre funzioni che definisco, invece di essere contenute in MyEnum.

Il mio file api.i è:

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

ho generare con SWIG

swig -builtin -python api.i 

e importarlo in Python

import _api 

E ora devo utilizzare i valori enum dal modulo _api:

_api.ONE 
_api.TWO 
_api.THREE 

Mentre io voglio usarli come

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

Qualcuno sa come posso fare questo?

+4

Il modulo _api Thd è privato. Non dovresti usarlo direttamente. – Flexo

risposta

1

C'è una funzione SWIG nspace che vorrebbe volere, ma sfortunatamente non è ancora supportata per Python. Ho sempre dovuto definire l'enum in una struttura per farlo apparire nel modo desiderato in SWIG. Esempio:

%module tmp 

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

Risultato:

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

Quello che dovete capire è che in C quei nomi nella vostra enum non sono namespace come sarebbero in Python. Probabilmente dovresti leggere qualcosa su come enums can be used prima di continuare.

Ora si noti che poiché si tratta di nomi accessibili a livello globale, non verranno assegnati ai nomi in Python. La cosa migliore, è quello di creare un oggetto, in questo senso:

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

del(A, B, C) 

Allora A, B, C sarà accessibile solo tramite _api.MyEnum.A, ecc, e A, B, C non saranno direttamente accessibili.

Problemi correlati