如何迭代(键,值)提升::p ython:dict

How iterate (key, value) boost::python:dict

本文关键字:提升 ython dict 何迭代 迭代      更新时间:2023-10-16

如何在C++中迭代我的boost::p ython:dict? 我需要在每个循环中键和

我的尝试是这样的:

for (auto x : MyBoostPythonDict.iteritems())
{
// determine key
// determine value 
// ...
}

我收到此错误:C3312 找不到类型"boost::p ython::api::object"的可调用"结束"函数

Boost Python在"stl_iterator"标头中公开了一些STL迭代器包装器,让你像普通的C++迭代一样从beginend

https://www.boost.org/doc/libs/1_75_0/libs/python/doc/html/reference/high_level_components/boost_python_stl_iterator_hpp.html

对于 Python 版本 2,您可以使用d.items()d.iteritems(),具体取决于您是否要延迟迭代。对于 Python 版本 3 有一个小问题 - 你认为items是一个懒惰的dict视图,但 Boost Python 将其转换为列表。因此,我调用.attr("items")()来绕过内置转换,从而获得懒惰的包装器。我已将此对象返回给Python,只是为了确认它是视图而不是列表。

调用stl_input_iterator<tuple>()会为您提供 (Python( 元组对象的迭代器,您可以从中提取键和值。

#include <boost/python/dict.hpp>
#include <boost/python/tuple.hpp>
#include <boost/python/stl_iterator.hpp>
#include <boost/python/extract.hpp>
#include <boost/python/str.hpp>
#include <boost/python.hpp>
#include <iostream>
using namespace boost::python;
object print_dict_to_cout(dict d) {
auto items = d.attr("items")(); // just plain d.items or d.iteritems for Python 2!
for (auto it = stl_input_iterator<tuple>(items); it != stl_input_iterator<tuple>(); ++it) {
tuple kv = *it;
auto key = kv[0];
auto value = kv[1];
std::cout << extract<const char*>(str(key)) << " : " << extract<const char*>(str(value)) << std::endl;
}
return items;
}
BOOST_PYTHON_MODULE(iterdict)
{
def("print_dict_to_cout", print_dict_to_cout);
}

这样做的好处是它是懒惰的,并且不会创建中间列表。

您可以简单地遍历所有键/值对,如下所示:

using namespace boost::python;
list items = MyBoostPythonDict.items();
for(ssize_t i = 0; i < len(items); ++i) {
object key = items[i][0];
object value = items[i][1];
// ...
}

现在您需要从keyvalue中提取相应的类型。假设两者都属于类型int您将使用:

extract<int> key_int(key);
extract<int> value_int(value);
if (key_int.check() && value_int.check()) {
cout << key_int << ": " << value_int << endl;
}

直接使用项目列表:

for (auto x : MyBoostPythonDict.items())

我猜iteritems可能打算像这样使用:

for(auto it = D.iteritems(); it; ++it)