python to c API, passing a tuple array

imdognuts at yahoo.com imdognuts at yahoo.com
Mon Apr 17 18:37:50 EDT 2006


Thanks for the solution!

Farshid Lashkari wrote:
> imdognuts at yahoo.com wrote:
> > Hi,
> > I want to pass something like this to a C function via the Python C
> > API.
> > mytuple = (("string_one", 1.2, 1.3), ("string_two", 1.4, 1.5), ......,
> > .....,  )
> > This tuple is dynamic in size, it needs to be 3 X N dimensions. each
> > tuple in the
> > tuple array is of the form (string, float, float) as described above
> >
> > so from python:
> >
> > mytuple = (("string_one", 1.2, 1.3), ("string_two", 1.4, 1.5))
> > api.myCFunction(mytuple)
> >
> > The C api:
> > static PyObject *myCFunction(PyObject *self, PyObject *args)
> > {
> >
> >     if (!PyArg_ParseTuple(args, "O", ..... ?????????????)  {
> >         printf(" error in PyArg_ParseTuple!\n");
> >         return Py_None;
> >     }
> >
> > Thanks.
> >
>
>
> Just loop through each item in the arguments and parse the sub-tuple.
> Here is some sample code that doesn't do any error checking:
>
> static PyObject *myCFunction(PyObject *self, PyObject *args)
> {
>      int numItems, i;
>      PyObject *tuple;
>
>      numItems = PyTuple_Size(args);
>
>      for(i = 0; i < numItems; ++i)
>      {
>          tuple = PyTuple_GetItem(args,i);
>          if(!PyArg_ParseTuple(tuple,"sff",...) {
>              //handle error
>              Py_RETURN_NONE;
>          }
>      }
> }
>
> Also, you need to INCREF Py_None before you return it. Or you can use
> the macro used in the sample code above.
> 
> -Farshid




More information about the Python-list mailing list