[Python-de] Extension

Stefan Behnel python-de at behnel.de
Di Mär 27 17:37:47 CEST 2012


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


Mehr Informationen über die Mailingliste python-de