Создание python collection.namedtuple из C ++ с использованием boost :: python

Я хотел бы вернуть список collections.namedtuple из обернутой функции boost :: python, но я не уверен, что делать с созданием этих объектов из кода C ++. Для некоторых других типов есть удобная оболочка (например, dict), которая делает это простым, но ничего подобного не существует для namedtuple. Каков наилучший способ сделать это?

Существующий код для списка dict:

namespace py = boost::python;

struct cacheWrap {
...
py::list getSources() {
py::list result;
for (auto& src : srcCache) {  // srcCache is a C++ vector
// {{{ --> Want to use a namedtuple here instead of dict
py::dict pysrc;
pysrc["url"] = src.url;
pysrc["label"] = src.label;
result.append(pysrc);
// }}}
}
return result;
}
...
};BOOST_PYTHON_MODULE(sole) {
py::class_<cacheWrap,boost::noncopyable>("doc", py::init<std::string>())
.def("getSources", &cacheWrap::getSources)
;
}

3

Решение

Следующий код делает работу. Лучшие решения получат чек.

Сделайте это в ctor, чтобы установить поле sourceInfo:

auto collections = py::import("collections");
auto namedtuple = collections.attr("namedtuple");
py::list fields;
fields.append("url");
fields.append("label");
sourceInfo = namedtuple("Source", fields);

Новый метод:

py::list getSources() {
py::list result;
for (auto& src : srcCache)
result.append(sourceInfo(src.url, src.label));
return result;
}
7

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector