2015-06-23 10 views
5

Ich versuche, eine Enum-Klasse in einer C++ - Header-Datei für die Verwendung in einem Cython-Projekt zu wickeln.Ich habe gegoogled herum und kann nicht herausfinden, wie dies erreicht wird - wird es unterstützt?Wrap Enum-Klasse für Cython

+1

Können Sie mit einem Beispiel mit 'cdef enum Foo: [...]' nicht auf Ihre Bedürfnisse eingehen? – coincoin

+1

Ich wickle nicht eine C enum, aber eine C + + enum-Klasse, so dass dies nicht funktioniert – user3684792

+0

Machen Sie die Enum als 'ctypedef' und den Inhalt der Enumeration in einem Namespace? (Ich habe das nicht getestet, aber es scheint, es könnte funktionieren) – DavidW

Antwort

6

CPP Klasse

enum class Color {red, green = 20, blue}; 

Definition von Typ

cdef extern from "colors.h": 
    cdef cppclass Color: 
    pass 

Definition von Farbtypen

cdef extern from "colors.h" namespace "Color": 
    cdef Color red 
    cdef Color green 
    cdef Color blue 

Python-Implementierung

cdef class PyColor: 
    cdef Color thisobj 
    def __cinit__(self, int val): 
    self.thisobj = <Color> val 

    def get_color_type(self): 
    cdef c = {<int>red : "red", <int> green : "green", <int> blue : "blue"} 
    return c[<int>self.thisobj] 
0

Hier ist eine alternative Lösung, die die Möglichkeit verwendet, den Namen von Cython- und C++ - Bezeichnern zu ändern.

header.hpp

namespace foo { 
enum class Bar : uint32_t { 
    BAZ, 
    QUUX 
}; 
} 

header.pxd

cdef extern from "header.hpp" namespace "foo::Bar": 
    cdef enum Bar "foo::Bar": 
     BAZ, 
     QUUX 

main.pyx

from header cimport * 
cdef void doit(Bar b): 
    pass 

doit(BAZ) # Not Bar.BAZ, which would have been nicer. 

Es ist effektiv Tellin g Cython, dass es einen Namespace namens "foo :: Bar" gibt, und fügt eine C-Stil-Enumeration ein. Um der Tatsache entgegenzuwirken, dass Bar sonst "foo :: Bar :: Bar" werden würde, erhält man auch einen überschriebenen Namen. Es bedeutet, dass Bar :: BAZ in Cython als BAZ und nicht als Bar.BAZ bezeichnet wird, was eine idiomatische Repräsentation von Enum-Klassen wäre, aber es scheint nahe genug zu sein.