2013-05-09 13 views
8

Mam proste wyliczenia w C w myenum.h:owijania C-enum w moduł Pythona z Swig

enum MyEnum { 
    ONE, 
    TWO, 
    THREE 
}; 

Problem polega na tym, że kiedy na mapie, aby Python, można uzyskać dostęp tylko za pośrednictwem enum nazwa modułu, a nie przez MyEnum. Tak więc wartości JEDNEGO, DWÓCH, TRZECICH są zawarte w innych zdefiniowanych przeze mnie funkcjach, zamiast być zawarte w MyEnum.

Mój plik api.i jest:

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

wygenerować z SWIG

swig -builtin -python api.i 

i zaimportować je w Pythonie

import _api 

A teraz muszę używać wartości enum z modułu _api:

_api.ONE 
_api.TWO 
_api.THREE 

Chociaż chcę używać ich jak

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

Czy ktoś wie, w jaki sposób można to osiągnąć?

+4

Thd Moduł _api jest prywatny. Nie powinieneś używać go bezpośrednio. – Flexo

Odpowiedz

1

Istnieje funkcja SWIG nspace, która by chciała zechcesz, ale niestety nie jest jeszcze obsługiwana w Pythonie. Zawsze musiałem zdefiniować enum w strukturze, aby pojawił się w sposób, w jaki pragniesz w SWIG. Przykład:

%module tmp 

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

Wynik:

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

Co trzeba zrozumieć, że w C te nazwy twojej wyliczenia nie są w przestrzeni nazw, gdyż byłyby w Pythonie. Przed kontynuowaniem prawdopodobnie powinieneś przeczytać coś o tym, jak enums can be used.

Pamiętaj, że ponieważ są to nazwy dostępne globalnie, nie będą one wyświetlane w Pythonie. Najprościej jest stworzenie obiektu, wzdłuż tych linii:

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

del(A, B, C) 

Wtedy A, B, C będą dostępne tylko przez _api.MyEnum.A, itd., A A, B, C nie będą bezpośrednio dostępne.

Powiązane problemy