Bernd Nawothnig, 27.03.2012 17:03:
Ein Pythonprogramm ruft eine in C geschriebene Extension mit einem Parameter auf, der aus einer in ein numpy.array konvertierten Python-Liste von Objekten besteht. Das C-Programm nutzt dazu einen Zeiger auf dieses nun eng gepackte Array von Zeigern und wählt durch einen geeigneten Algorithmus aus dieser Objektmenge einige aus, die nun in eine Python-Liste von Python-Listen von Objekten gekapselt zurückgegeben werden. Freigegeben oder verändert wird keines der beim Aufruf der Extension übergebenen Objekte. Die Python-Ergebnisliste wird in C so konstruiert: ... PyObject *r = PyList_New(0); ... static PyObject *VLP_asPyList(VectorlistP *vl) { PyObject *result = PyList_New(vl->length); int i;
for (i=0; i<vl->length; i++) PyList_SetItem(result, i, Py_BuildValue("O", vl->list[i]->anomaly)); // ^^^^^^^^^^^^^^^^^^^^ // Zeiger auf eins der ursprünglichen Objekte return result; } ... PyList_Append(r, VLP_asPyList(&bestResult));
Hier war ein "extend()" gemeint, oder?
return r;
Zum Vergleich der (mangels umgebendem Code und Daten natürlich ungetestete) äquivalente Code in Cython: return [ item.anomaly for item in bestResult.list[:bestResult.length] ] Finde ich hübscher und übersichtlicher. Stefan