Обернуть вектор члена C ++ как Python OrderedDict

Отредактировано, чтобы лучше объяснить вопрос:

У меня есть класс, похожий на этот:

#include <vector>
#include <utility>
#include <string>

class Test
{
public:
std::vector<std::pair<std::string, std::string>> a;
bool read(const std::string& path);
bool write(const std::string& path);
}

и я хочу изменить установщик и получатель, созданные Swig для Python, чтобы я мог получить / установить приказал толковый словарь.

В настоящее время используется следующее в файле интерфейса:

%include "stl.i"
%template(string_pair) std::pair<std::string, std::string>;
%template(string_pair_vec) std::vector< std::pair<std::string, std::string>>;

Я могу написать код Python как:

from collections import OrderedDict

t = Test()
d = OrderedDict(t.a)
t.a = string_pair_vec([(k,v) for k,v in d.items()])

Но, когда OrderedDict изменяется, пользователь должен правильно управлять t.a чтобы отразить изменения .. поэтому я думаю, что было бы лучше управлять этими операциями непосредственно в сгенерированном коде SWIG.

Из моего нынешнего понимания, если бы я имел дело с простым dictЯ мог бы сделать это с помощью typemap (что-то вроде этого: % typemapping библиотеки C ++ для интерфейса Python), но OrderedDict реализован на чистом Python.

Итак, моя текущая интуиция заключается в том, что я должен использовать что-то подобное в моем файле интерфейса:

%pythonappend Test::a %{
#Code to create and populate the ordered dict
%}

но вышеупомянутая подпись не работает (или, лучше, я не знаю, как идентифицировать установщик и получатель).

У кого-нибудь есть опыт с чем-то подобным?

2

Решение

В таких случаях я бы посоветовал не использовать ваш интерфейс ordereddict По сути, вместо этого создайте «совместимый» интерфейс, который в Python будет работать так:

t = Test()
t.a = ordereddict(...).items()
print(ordereddict(t.a))

То есть вместо того, чтобы отображать ваш вектор на ordereddict непосредственно, заставить получатель возвращать последовательность (список или генератор) из 2-х кортежей и заставить установщик принимать последовательность из 2-х кортежей. Это более гибко и позволяет пользователям API хранить значения в Python list если они предпочитают (что намного больше похоже на то, как вы храните их в C ++). И это обходит вопрос о том, как получить ordereddict работает в SWIG.

3

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

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

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