Оболочка Python c ++: преобразование многотипной структуры в представление Python (предпочтительный словарь) - PullRequest
0 голосов
/ 18 ноября 2018

Я выбрал setuptools, чтобы использовать мой код C / C ++ из сценариев Python.Одним из этапов при создании такой оболочки является преобразование возвращаемого значения C / C ++ в объект python.

До сих пор я был в состоянии преобразовать простые примитивные значения и список примитивных значений.Однако я хочу расширить его до многозначной структуры, как показано в примере ниже.

Моя главная задача сейчас заключается в том, как мне создать представление структуры python (PyObject* ret = PyList_New(...);) и правильно установить его значения для разных типов.

Я попытался создать списокэлементы из одних и тех же типов (например, std::vector<float>) и могут правильно установить значения, используя Py_BuildValue и PyList_SetItem, но я все еще борюсь с несколькими типами ...

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 Ответ

0 голосов
/ 18 ноября 2018

Вы, вероятно, хотите заглянуть в объект словаря: Объекты словаря

Я предполагаю, что вы захотите установить значения с PyDict_SetItemString() в соответствии с этим документом.

НТН

...