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 das "Cython" -Tutorial, das Python explosiv macht: So analysieren Sie die in C ++ - Code definierte Enum-Klasse in Enum in Python. Dies ist eine Fortsetzung von.
Der Code ist unter "github hier" aufgeführt. Schauen Sie also bitte vorbei.
Beim letzten Mal habe ich erklärt, wie die in C ++ deklarierte Enum-Klasse an die Python-Seite Enum auf der Python-Seite übergeben wird, wenn eine in C ++ geschriebene Bibliothek nach Cython konvertiert wird, damit sie von Python aus verwendet werden kann.
Dieses Mal werde ich Cythonization erklären, wenn die Funktion auf der C ++ - Seite überladen ist (wenn die Konfiguration den gleichen Funktionsnamen, aber unterschiedliche Argumente hat).
Erstellen Sie die folgende Funktion auf der C ++ - Seite der Bibliothek, die Sie bisher geschrieben haben.
Hier ist die Funktion `print_vector``` eine Funktion, die`
vector `und` `vector <double>`
als Argumente und in einem solchen Fall die Funktion verwenden kann Soll überlastet sein.
cpp_library/TestClass1.h
class TestClass1{
private:
TestClass2 property_test_class2;
EnumForTestClass1 group;
public:
//~ Abkürzung
static void print_vector(vector<int> x);
static void print_vector(vector<double> x);
Der Inhalt ist nur eine Funktion zum Drucken des Inhalts des Vektors, wie unten gezeigt.
cpp_library/TestClass1.cpp
void TestClass1::print_vector(vector<int> x){
for(int i=0; i<x.size(); i++){
cout << x[i] << " ";
}
cout << endl;
}
void TestClass1::print_vector(vector<double> x){
for(int i=0; i<x.size(); i++){
cout << x[i] << " ";
}
cout << endl;
}
Rufen Sie diese `` `print_vector``` -Funktion wie im Beispiel von Cython aus auf.
cython/my_library.pxd
cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
cdef cppclass TestClass1:
#~ Abkürzung
void print_vector(vector[int] x)
void print_vector(vector[double] x)
cython/test_class1.pxd
cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
cdef cppclass TestClass1:
#~ Abkürzung
void print_vector(vector[int] x)
void print_vector(vector[double] x)
Hier implementieren wir den Inhalt in `` `cython / test_class1.pyx```.
cython/test_class1.pyx
@staticmethod
def print_vector(list x):
cdef TestClass1 testclass1
return testclass1.print_vector(x)
Wenn ich versuche, `python setup.py install
`as auszuführen
Error compiling Cython file:
------------------------------------------------------------
...
return testclass1.test_vector_int_ref(x,y)
@staticmethod
def print_vector(list x):
cdef TestClass1 testclass1
return testclass1.print_vector(x)
^
------------------------------------------------------------
cython/test_class1.pyx:51:38: no suitable method found
Ich bekomme einen Fehler und werde wütend. .. Es ist natürlich, wenn Sie darüber nachdenken, aber weil die Funktion `` `print_vector``` auf der C ++ - Seite überladen ist, Sie wissen nicht, auf welche Funktion Sie sich beziehen. Um dies zu lösen, müssen Sie umwandeln und angeben, welche Funktion Sie aufrufen.
Schreiben Sie also `cython / test_class1.pyx
`wie folgt um.
cython/test_class1.pyx
@staticmethod
def print_vector(list x):
cdef TestClass1 testclass1
if isinstance(x[0], int):
return testclass1.print_vector(<vector[int]>x)
elif isinstance(x[0], float):
return testclass1.print_vector(<vector[double]>x)
else:
raise Exception('TypeError')
Dies geschieht, indem zuerst das Argument `x``` als`
list``` und dann angegeben wird
Welche Funktion auf der C ++ - Seite aufgerufen wird, hängt vom Inhaltstyp ab.
Wenn Sie es tatsächlich so schreiben, können Sie es mit `python setup.py install
`erstellen.
test.py
import my_library as myl
if __name__ == "__main__":
cl1 = myl.test()
x = [1,2,3]
y = [1.1, 2.2, 3.3]
cl1.print_vector(x)
cl1.print_vector(y)
Wenn Sie laufen und testen,
(myenv) root@e96f489c2395:/from_local/cython_practice# python test.py
1 2 3
1.1 2.2 3.3
Sie sehen, dass die Funktion auf der C ++ - Seite erfolgreich aufgerufen werden kann.
Dieses Mal habe ich Cythonization erklärt, wenn die Funktion auf der C ++ - Seite überladen ist (wenn die Konfiguration denselben Funktionsnamen, aber unterschiedliche Argumente hat).
Ich glaube, ich habe es behandelt, und was schreiben Sie sonst noch oft in C ++? Ich habe nicht entschieden, was ich als nächstes schreiben soll, also werde ich das nächste schreiben, sobald das Material entschieden ist.
Diesmal.
Ende.
Recommended Posts