Отредактировано, чтобы лучше объяснить вопрос:
У меня есть класс, похожий на этот:
#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
%}
но вышеупомянутая подпись не работает (или, лучше, я не знаю, как идентифицировать установщик и получатель).
У кого-нибудь есть опыт с чем-то подобным?
В таких случаях я бы посоветовал не использовать ваш интерфейс ordereddict
По сути, вместо этого создайте «совместимый» интерфейс, который в Python будет работать так:
t = Test()
t.a = ordereddict(...).items()
print(ordereddict(t.a))
То есть вместо того, чтобы отображать ваш вектор на ordereddict
непосредственно, заставить получатель возвращать последовательность (список или генератор) из 2-х кортежей и заставить установщик принимать последовательность из 2-х кортежей. Это более гибко и позволяет пользователям API хранить значения в Python list
если они предпочитают (что намного больше похоже на то, как вы храните их в C ++). И это обходит вопрос о том, как получить ordereddict
работает в SWIG.
Других решений пока нет …