加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用boost :: python从C创建python collections.namedtuple

发布时间:2020-12-16 09:40:55 所属栏目:百科 来源:网络整理
导读:我想从boost :: python包装函数返回collections.namedtuple列表,但我不知道如何从C代码创建这些对象.对于其他一些类型,有一个方便的包装器(例如dict),这使得这很简单,但是对于namedtuple来说并不存在.做这个的最好方式是什么? dict列表的现有代码: namespa
我想从boost :: python包装函数返回collections.namedtuple列表,但我不知道如何从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)
   ;
}

解决方法

以下代码完成了这项工作.更好的解决方案将得到检查.

在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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读