Je veux faire du code écrit en C ++ une bibliothèque qui puisse être appelée en Python. Cependant, il y avait un grand mur appelé Cython.
Voici le tutoriel "Cython" qui rend Python explosif: Comment analyser la classe Enum définie dans le code C ++ dans Enum en Python. Ceci est une continuation de.
Le code est répertorié dans "github here", veuillez donc y jeter un œil.
La dernière fois, j'ai expliqué comment passer la classe Enum déclarée en C ++ à la classe Enum du côté Python lors de la conversion d'une bibliothèque écrite en C ++ en Cython afin qu'elle puisse être utilisée à partir de Python.
Cette fois, j'expliquerai la Cythonisation lorsque la fonction côté C ++ est surchargée (lorsque la configuration a le même nom de fonction mais des arguments différents).
Créez la fonction suivante du côté C ++ de la bibliothèque que vous avez écrite jusqu'à présent.
Ici, la fonction print_vector``` est une fonction qui peut prendre
vector <int>
et
vector <double> ''
comme arguments, et dans un tel cas, la fonction On dit qu'il est surchargé.
cpp_library/TestClass1.h
class TestClass1{
private:
TestClass2 property_test_class2;
EnumForTestClass1 group;
public:
//~ abrégé
static void print_vector(vector<int> x);
static void print_vector(vector<double> x);
Le contenu n'est qu'une fonction pour imprimer le contenu du vecteur comme indiqué ci-dessous.
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;
}
Pensez à appeler cette fonction `` print_vector '' à partir de Cython comme dans l'exemple.
cython/my_library.pxd
cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
cdef cppclass TestClass1:
#~ abrégé
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:
#~ abrégé
void print_vector(vector[int] x)
void print_vector(vector[double] x)
Ici, nous allons implémenter le contenu de
cython / test_class1.pyx```.
cython/test_class1.pyx
@staticmethod
def print_vector(list x):
cdef TestClass1 testclass1
return testclass1.print_vector(x)
Quand j'essaye d'exécuter
python setup.py install` '' comme
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
J'obtiens une erreur et je me fâche. .. C'est naturel quand on y pense, mais parce que la fonction
print_vector``` côté C ++ est surchargée,
Vous ne savez pas à quelle fonction vous faites référence.
Pour résoudre ce problème, vous devez effectuer un cast et spécifier la fonction que vous appelez.
Alors, réécrivez
cython / test_class1.pyx` '' comme suit.
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')
Ceci est fait en spécifiant d'abord l'argument
x comme `` `` liste
et ensuite
La fonction appelée côté C ++ est spécifiée par le type de son contenu.
Si vous l'écrivez réellement comme ceci, vous pouvez le construire avec
python setup.py install` ``,
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)
Lorsque vous exécutez et testez,
(myenv) root@e96f489c2395:/from_local/cython_practice# python test.py
1 2 3
1.1 2.2 3.3
Vous pouvez voir que la fonction côté C ++ peut être appelée avec succès.
Cette fois, j'ai expliqué la Cythonisation lorsque la fonction côté C ++ est surchargée (lorsque la configuration a le même nom de fonction mais des arguments différents).
Je pense que je l'ai couvert, et qu'écrivez-vous souvent en C ++? Je n'ai pas décidé quoi écrire ensuite, alors j'écrirai le suivant dès que le matériel sera décidé.
Cette fois-ci.
fin.
Recommended Posts