Вопрос действительно сводится к следующему: у вас есть класс, и вы хотите преобразовать его в нативный объект Python (а не в обернутый объект). SWIG автоматически генерирует обернутые объекты, но вам нужно go, чтобы преобразовать типы C ++ в собственные Python типы.
Я предполагаю, что это упрощенное Bunch
, чтобы сделать карту типов немного более читабельным. Вы должны быть в состоянии приспособить это к вашему Bunch
довольно легко. В качестве альтернативы, вы можете преобразовать свой класс в эту простую структуру, прежде чем передать его в Python.
struct Bunch {
float i, b, c;
std::vector<float> dert;
};
Bunch makeBunch();
Вот реализация makeBunch
.
Bunch makeBunch() {
return {1.0, 2.0, 3.0, {1.2, 2.3, 3.4, 4.5, 5.6}};
}
Я пропустил проверка ошибок, чтобы она была короткой и лаконичной.
%typemap(out) Bunch {
$result = PyDict_New();
PyDict_SetItem($result, PyBytes_FromString("I"), PyFloat_FromDouble($1.i));
PyDict_SetItem($result, PyBytes_FromString("B"), PyFloat_FromDouble($1.b));
PyDict_SetItem($result, PyBytes_FromString("C"), PyFloat_FromDouble($1.c));
PyObject *dert = PyList_New($1.dert.size());
for (size_t i = 0; i != $1.dert.size(); ++i) {
PyList_SetItem(dert, i, PyFloat_FromDouble($1.dert[i]));
}
PyDict_SetItem($result, PyBytes_FromString("dert_"), dert);
}
Когда я сам скомпилировал и запустил ее, я получил ожидаемые результаты (ну, достаточно близко!).
>>> import test
>>> test.makeBunch()
{'I': 1.0, 'C': 3.0, 'B': 2.0, 'dert_': [1.2000000476837158, 2.299999952316284, 3.4000000953674316, 4.5, 5.599999904632568]}
Карта типов не обязательна. Вместо этого вы можете просто использовать обернутые объекты. Удалите карту типов и убедитесь, что вы выставили std::vector<float>
следующим образом.
%include "std_vector.i"
%template(FloatVector) std::vector<float>;
Затем вы можете получить доступ к Bunch
через обернутый объект.
>>> import test
>>> bunch = test.makeBunch()
>>> bunch
<test.Bunch; proxy of <Swig Object of type 'Bunch *' at 0x10b6daba0> >
>>> bunch.i
1.0
>>> bunch.b
2.0
>>> bunch.c
3.0
>>> bunch.dert
<test.FloatVector; proxy of <Swig Object of type 'std::vector< float,std::allocator< float > > *' at 0x10b6dadb0> >
>>> for d in bunch.dert:
... print(d)
...
1.20000004768
2.29999995232
3.40000009537
4.5
5.59999990463
Некоторые авторитетные источники: