Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using Py_BuildValue() to create a list of tuples in C

Tags:

python

c

pyobject

I am trying to use Py_BuildValue() to create a list of tuples in C.

What I am trying to build would look like this:

[ (...), (...), ... ] 

I don't know the amount of tuples to create at compilation, so I can't use some static amount here.

Essentially using Py_BuildValue() with one tuple here is what it would look like for the code:

PyObject * Py_BuildValue("[(siis)]", name, num1, num2, summary);

But that would only be for one tuple. I need to have multiple tuples in the list that I could add via a for loop. How can I accomplish this?

like image 624
ComputerLocus Avatar asked Mar 17 '16 02:03

ComputerLocus


1 Answers

You can use PyList_New(), PyTuple_New(), PyList_Append(), and PyTuple_SetItem() to accomplish this...

const Py_ssize_t tuple_length = 4;
const unsigned some_limit = 4;

PyObject *my_list = PyList_New(0);
if(my_list == NULL) {
    // ...
}

for(unsigned i = 0; i < some_limit; i++) {
    PyObject *the_tuple = PyTuple_New(tuple_length);
    if(the_tuple == NULL) {
        // ...
    }

    for(Py_ssize_t j = 0; i < tuple_length; i++) {
        PyObject *the_object = PyLong_FromSsize_t(i * tuple_length + j);
        if(the_object == NULL) {
            // ...
        }

        PyTuple_SET_ITEM(the_tuple, j, the_object);
    }

    if(PyList_Append(my_list, the_tuple) == -1) {
        // ...
    }
}

That will create a list of the form...

[(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11), (12, 13, 14, 15)]
like image 126
3442 Avatar answered Sep 19 '22 16:09

3442