Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C+;创建python collections.namedtuple+;使用boost::python 我想从Booo::Python包装函数返回一个集合.NAMEDUBEPUT/CODE>的列表,但是我不知道如何从C++代码中创建这些对象。对于其他一些类型,有一个方便的包装器(例如dict),它使这变得很容易,但对于namedtuple,没有类似的包装器。最好的方法是什么_C++_Python_Python 3.x_Boost Python - Fatal编程技术网

从C+;创建python collections.namedtuple+;使用boost::python 我想从Booo::Python包装函数返回一个集合.NAMEDUBEPUT/CODE>的列表,但是我不知道如何从C++代码中创建这些对象。对于其他一些类型,有一个方便的包装器(例如dict),它使这变得很容易,但对于namedtuple,没有类似的包装器。最好的方法是什么

从C+;创建python collections.namedtuple+;使用boost::python 我想从Booo::Python包装函数返回一个集合.NAMEDUBEPUT/CODE>的列表,但是我不知道如何从C++代码中创建这些对象。对于其他一些类型,有一个方便的包装器(例如dict),它使这变得很容易,但对于namedtuple,没有类似的包装器。最好的方法是什么,c++,python,python-3.x,boost-python,C++,Python,Python 3.x,Boost Python,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 o

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)
   ;
}
namespace py=boost::python;
结构缓存包裹{
...
py::list getSources(){
py::列出结果;
对于(Auto&SRC:SRCACHACE){//SrCACHACE是C++向量
//{{-->要在此处使用namedtuple而不是dict吗
py::dict-pysrc;
pysrc[“url”]=src.url;
pysrc[“label”]=src.label;
结果追加(pysrc);
// }}}
}
返回结果;
}
...
};
BOOST_PYTHON_模块(唯一){
py::class_u3;(“doc”,py::init())
.def(“getSources”,&cacheWrap::getSources)
;
}

以下代码执行此操作。更好的解决方案将得到检验

在ctor中执行此操作以设置字段sourceInfo:

新方法:


名为tuple的
tuple
的一个子类,因此您可以从处理前者的代码开始,并相应地修改它。
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;
}