2

I've chosen setuptools to use my C/C++ code from python scripts. One of the phases when building such wrapper is to convert the C/C++ return value into python object.

So far I was able to convert simple primitive values and list of primitive values. However, I wish to extend it to multi-value struct, as shown in the example below.

My main challenge right now is how do I create the python struct representation (PyObject* ret = PyList_New(...);) and I do I set it's values properly with the different types.

I tried to create list of items from the same types (such as std::vector<float>) and manage to set the values properly using Py_BuildValue and PyList_SetItem, but I'm still struggling with the multi types...

typedef struct _fileParams 
{
    bool valid;
    int index;
    std::string key;
    std::value value;
} fileParams;

FileDataBase * db;

static PyObject *searchFileInDB(PyObject *self, PyObject *args)
{
    if (db == NULL) 
    {
        PyErr_SetString(PyExc_RuntimeError, "DB could not be initialized");
        return NULL;
    }

    char* fileName = NULL;
    int fileNameSize = 0;
    PyArg_ParseTuple(args, "s#", &fileName, &fileNameSize);
    try 
    {
        fileParams p;
        bool res = db->lookup(fileName, fileNameSize, p);
        PyObject* ret = PyList_New(...);

        if (res) 
        {                    
            PyObject* r1 = Py_BuildValue("b", p.valid);
            PyList_SetItem(ret, 0, r1);

            PyObject* r2 = Py_BuildValue("i", p.index);
            PyList_SetItem(ret, 1, r2);

            PyObject* r1 = Py_BuildValue("s", p.key);
            PyList_SetItem(ret, 2, r3);

            PyObject* r1 = Py_BuildValue("s", p.value);
            PyList_SetItem(ret, 3, r4);
        }
        return ret;
    } catch (...) {
        PyErr_SetString(PyExc_RuntimeError, "failed with C exception");
        return NULL;
    }
}

1 Answer 1

1

You probably want to look into the Dictionary Object: Dictionary Objects

I'm guessing you'd want to set values with PyDict_SetItemString() as per that doc.

HTH

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.