То, что вы пометили как «Ошибка», является правильным (или, по крайней мере, ожидаемым) результатом: deque транслируется в кортеж Python. Чтобы добраться до вашей карты, просто получите доступ к первому элементу, а затем к карте:
>>> from f_p import form_p
>>> print(form_p([1,2,3]))
(<f_p.map; proxy of <Swig Object of type 'std::map< char,int > *' at 0x7f16259a1c60> >,)
>>> d = form_p([1,2,3])
>>> len(d)
1
>>> d[0]
<f_p.map; proxy of <Swig Object of type 'std::map< char,int > *' at 0x7f16259aeb40> >
>>> m = d[0]
>>> len(m)
3
>>> m.keys()
['A', 'B', 'C']
>>> m['B']
2
>>> for m in d:
... print m.keys()
...
['A', 'B', 'C']
>>>
РЕДАКТИРОВАТЬ : продолжение на основе комментариев. Для std::deque
уже существует типовая карта «out», которая, к сожалению, более точно соответствует, поэтому, если вы не укажете std::deque<std::map<char, int>> form_p
полностью (т.е. с именем функции), она не будет соответствовать, поэтому в следующем примере вместо нее используется «ret» , чтобы применить ко всем вашим функциям, которые возвращают такие запросы. Добавить к f_p.i:
%typemap(ret) std::deque<std::map<char, int>> {
$result = PyTuple_New($1.size());
for (int i = 0; i < (int)$1.size(); ++i)
PyTuple_SetItem($result, i, swig::traits_from<std::map<char, int>>::asdict($1[i]));
}
Этот код создает кортеж (используйте PyList_New
и PyList_SetItem
, если вы предпочитаете список python), затем перебирает записи в deque и конвертирует их до python диктов. Вызов asdict
- это сгенерированная python функция, которую вы также можете использовать в python коде постобработки в .i, если хотите,
С этим на месте результат:
>>> from f_p import form_p
>>> print(form_p([1,2,3]))
({'A': 1, 'C': 3, 'B': 2},)
>>>