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
5
A
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.
Können Sie mit einem Beispiel mit 'cdef enum Foo: [...]' nicht auf Ihre Bedürfnisse eingehen? – coincoin
Ich wickle nicht eine C enum, aber eine C + + enum-Klasse, so dass dies nicht funktioniert – user3684792
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