"Cython" -Tutorial, um Python explosiv zu machen: So analysieren Sie die in C ++ - Code definierte Enum-Klasse mit Enum in Python.

Überblick

Ich möchte in C ++ geschriebenen Code zu einer Bibliothek machen, die in Python aufgerufen werden kann. Es gab jedoch eine große Mauer namens Cython.

Dies ist Bridge von C ++ zu Python "Cython" -Kurs: So übergeben Sie ein C ++ - Klassenobjekt an ein Klassenobjekt auf der Python-Seite. Teil 2 ist eine Fortsetzung.

Wie immer werde ich den Code auf github here veröffentlichen. !!

Situationserklärung

Angenommen, Sie definieren eine Enum-Klasse auf der C ++ - Seite und haben sie als Eigenschaft der Klasse. Wenn Sie diese Eigenschaft zu diesem Zeitpunkt mit Getter usw. erhalten, ist der Rückgabewert natürlich die Enum-Klasse. Bei der Konvertierung in Cython handelt es sich bei diesem Rückgabewert um eine Klasse, die auf der Python-Seite nicht definiert ist. Daher muss sie nach der Definition in Cython analysiert und zurückgegeben werden.

Lassen Sie uns zunächst einen kurzen Blick darauf werfen, wie Enum in C ++ und Python geschrieben wird.

So schreiben Sie die Enum-Klasse in C ++.


enum class Color{
    RED = 0,
    GREEN = 1,
    BLUE = 2
};

So schreiben Sie die Enum-Klasse in Python.


class Color(Enum):
    RED = 0
    GREEN = 1
    BLUE = 2

Ich habe die Enum-Klasse von der C ++ - Seite so hinzugefügt.

Fügen Sie die Eigenschaft (Gruppe) der Enum-Klasse zu TestClass1.h und TestClass1.cpp hinzu, die bisher geschrieben wurden. Entsprechend haben wir auch Getter und Setter für die Gruppeneigenschaft hinzugefügt.

cpp_library/TestClass1.h



enum class EnumForTestClass1{
    ZERO = 0,
    ONE = 1
};

class TestClass1{
    private:
        TestClass2 property_test_class2;
        EnumForTestClass1 group;

    public:
        //~ Abkürzung

        void set_group(EnumForTestClass1 group);
        EnumForTestClass1 get_group();

cpp_library/TestClass1.cpp



EnumForTestClass1 TestClass1::get_group(){
    return this->group;
}

void TestClass1::set_group(EnumForTestClass1 group){
    this->group = group;
}

Dieser Getter und Setter werden in Cython konvertiert, dh die Enum-Klasse auf der C ++ - Seite und die Enum-Klasse auf der Python-Seite sind verbunden.

Übergeben der Enum-Klasse von der C ++ - Seite an die Enum-Klasse auf der Python-Seite.

Wie gewöhnlich

cytyon/test_class1.C bis pxd++Definieren Sie die Neben-Enum-Klasse. Die Definitionsmethode ist gemäß der folgenden Datei unterteilt.


 Fügen Sie danach die Definitionen des erstellten Getters und Setters hinzu.



#### **`cython/test_class1.pxd`**
```pxd


cdef extern from "../cpp_library/TestClass1.h":
        cdef cppclass EnumForTestClass1:
            EnumForTestClass1()

cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
        cdef EnumForTestClass1 ZERO
        cdef EnumForTestClass1 ONE  

cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
    cdef cppclass TestClass1:
        #~ Abkürzung
        void set_group(EnumForTestClass1 group)
        EnumForTestClass1 get_group();    

Fügen Sie die gleiche Beschreibung auch zu `` `cython / my_library.pxd``` hinzu.

cython/my_library.pxd


cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
        cdef cppclass EnumForTestClass1:
            EnumForTestClass1()

cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
        cdef EnumForTestClass1 ZERO
        cdef EnumForTestClass1 ONE   

cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
    cdef cppclass TestClass1:
        #~ Abkürzung
        void set_group(EnumForTestClass1 group)
        EnumForTestClass1 get_group();   

Sobald dies erledigt ist, besteht der nächste Schritt darin, den Inhalt von Getter und Setter in `` `cython / tests_class1.pyx``` zu schreiben. Wenn Sie den Code zuerst schreiben, sieht er folgendermaßen aus:

cython/tests_class1.pyx


cpdef enum Py_EnumForTestClass1:
    Py_ZERO = 0
    Py_ONE = 1


cdef class TestClass1Cython:
    cdef TestClass1* ptr


    def set_group(self, Py_EnumForTestClass1 group):
        return self.ptr.set_group(<EnumForTestClass1> group)

    def get_group(self):
        cdef:
            EnumForTestClass1* cpp_enum_for_test_class1 = new EnumForTestClass1()
        cpp_enum_for_test_class1[0] = <EnumForTestClass1>self.ptr.get_group()

        if(<int>cpp_enum_for_test_class1[0] == <int>Py_EnumForTestClass1.Py_ZERO):
            return Py_EnumForTestClass1.Py_ZERO
        elif(<int>cpp_enum_for_test_class1[0] == <int>Py_EnumForTestClass1.Py_ONE):
            return Py_EnumForTestClass1.Py_ONE

Definieren Sie zunächst die Enum-Klasse, die von Python aus aufgerufen werden kann, mit `` `cpdef enum Py_EnumForTestClass1```.

Als nächstes wird in Bezug auf den Setter `Py_EnumForTestClass1``` von der Python-Seite empfangen und an die C ++ - Seitenfunktion übergeben, indem es mit` `` `in den C ++ - Seitentyp umgewandelt wird.

Auch wenn es in Bezug auf Getter etwas redundant ist, wird das, was als Enum-Objekt auf der C ++ - Seite in `<EnumForTestClass1> self.ptr.get_group ()` übergeben wurde, mit und dem Wert dieses int umgewandelt. Die if-Anweisung bestimmt, welches der `Py_EnumForTestClass1 auf der Python-Seite gleich ist, und das `` Py_EnumForTestClass1```-Objekt wird entsprechend zurückgegeben.

Mit dem oben Gesagten ist es möglich, die Enum-Klasse auf der Python-Seite mit der Enum-Klasse auf der C ++ - Seite und die Enum-Klasse auf der C ++ - Seite mit der Enum-Klasse auf der Python-Seite zu analysieren.

Endlich wie immer

python setup.py install


 Lassen Sie uns kompilieren und testen mit.


#### **`test.py`**
```py

import my_library as myl

if __name__ == "__main__":
    cl1 = myl.test()
    test1 = myl.Py_EnumForTestClass1.Py_ZERO
    cl1.set_group(test1)

    test2 = cl1.get_group()
    print(test2)

als Ergebnis,

(myenv) root@e96f489c2395:/from_local/cython_practice# python test.py 
0

Es wurde bestätigt, dass die Enum-Klasse festgelegt werden und zur C ++ - Eigenschaft gelangen konnte.

Zusammenfassung

Dieses Mal erklärte ich, dass beim Konvertieren einer in C ++ geschriebenen Bibliothek nach Cython, damit sie von Python aus verwendet werden kann, die in C ++ deklarierte Enum-Klasse an die Enum-Klasse auf der Python-Seite übergeben wird.

Inzwischen sollten Sie in der Lage sein, die meisten benutzerdefinierten Objekte auf der C ++ - Seite an die Python-Seite zu übergeben.

Das nächste Mal möchte ich darüber schreiben, wie Cython mit Funktionsüberladungen umgeht, die häufig auf der C ++ - Seite geschrieben werden.

Diesmal.

Ende.

Recommended Posts

"Cython" -Tutorial, um Python explosiv zu machen: So analysieren Sie die in C ++ - Code definierte Enum-Klasse mit Enum in Python.
So machen Sie einen String in Python zu einem Array oder ein Array zu einem String
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie ein C ++ - Klassenobjekt an ein Klassenobjekt auf der Python-Seite. Teil ①
"Cython" -Tutorial, um Python explosiv zu machen: Wenn eine Funktion auf der C ++ - Seite überlastet ist.
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie das C ++ - Klassenobjekt an das Klassenobjekt auf der Python-Seite. Teil 2
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Vorbereitung
[Python] Wie man eine Klasse iterierbar macht
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Schreiben Sie setup.py.
"Cython" Tutorial, um Python explosiv zu machen: Grundkonfiguration
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Zuallererst CMake.
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
So erstellen Sie ein Python-Paket mit VS Code
"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.
Verwendung der Methode __call__ in der Python-Klasse
Wie erstelle ich ein Python-Paket (geschrieben für Praktikanten)
So überprüfen Sie, ob ein Wert in einem Aufzählungstyp vorhanden ist
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
So verpacken Sie C in Python
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Wie bekomme ich Stacktrace in Python?
Verwendung von __slots__ in der Python-Klasse
Verwendung der C-Bibliothek in Python
So löschen Sie einen Taple in einer Liste (Python)
So generieren Sie eine Sequenz in Python und C ++
Einbetten von Variablen in Python-Strings
So erstellen Sie eine JSON-Datei in Python
So benachrichtigen Sie Discord-Kanäle in Python
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Ich möchte C ++ - Code aus Python-Code erstellen!
So nehmen Sie Python Interpreter-Änderungen in Pycharm vor
Sie können es in 3 Minuten tun! So erstellen Sie einen funktionierenden QR-Code (GIF)!
Verwendung der Python-Multiprocessing (Fortsetzung 3) apply_async in einer Klasse mit Pool als Mitglied
Analysieren Sie eine JSON-Zeichenfolge, die in eine Datei in Python geschrieben wurde
So konvertieren / wiederherstellen Sie einen String mit [] in Python
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
[Python] So erweitern Sie Variablen in einer Zeichenfolge
So erstellen Sie ein interaktives CLI-Tool mit Golang
So verwandeln Sie eine .py-Datei in eine .exe-Datei
So erstellen Sie einen Bild-Uploader mit Bottle (Python)
So führen Sie einen Befehl mit einem Unterprozess in Python aus
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
Ich habe versucht, einen Generator zu erstellen, der mit Python eine C # -Containerklasse aus CSV generiert
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
[Python] Erstellen einer Adjazenzmatrix / Adjazenzliste [Graphentheorie]
So schneiden Sie ein Block-Multiple-Array aus einem Multiple-Array in Python
So konvertieren Sie mit Python [Anwendung] von einem Array in ein Wörterbuch
Eine Geschichte darüber, wie man einen relativen Pfad in Python angibt.
So importieren Sie Dateien in Python an eine beliebige Stelle
[Python] Wie schreibe ich eine if-Anweisung in einen Satz?
So definieren Sie mehrere Variablen in einer Python for-Anweisung
Ich habe versucht "Wie man eine Methode in Python dekoriert"
So entwickeln Sie in einer virtuellen Python-Umgebung [Memo]
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
[Python] So geben Sie eine Pandas-Tabelle in eine Excel-Datei aus
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen