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

Я выбрал 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;
}
}

4

Решение

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

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

НТН

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]