2012-12-03 117 views
3

我想從boost :: python包函數返回collections.namedtuple的列表,但我不確定如何從C++代碼創建這些對象。對於其他一些類型,有一個方便的包裝器(例如字典),這使得這很容易,但沒有像namedtuple那樣存在。做這個的最好方式是什麼?對字典的名單使用boost :: python創建python collections.namedtple使用boost :: python

現有代碼:

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) 
    ; 
} 
+0

一個'namedtuple'是tuple'的'一個子類,所以也許你可以開始用處理前者的代碼並相應地修改它。 – martineau

回答

7

下面的代碼做這項工作。更好的解決方案將得到檢查。

爲此在構造函數來設置現場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; 
}