Boost Python 3遍历字典

时间:2019-07-19 14:49:55

标签: python c++ dictionary boost

我使用(Python 2.7)通过以下方式遍历dict

boost::python::list myList = myDict.items();
for(int i = 0; i < len(myList); i++)
{
     pytuple pair = extract<pytuple>(itemsView[t]);
     string memberKey = extract<string>(pair[0]);
     object member = pair[1];
}

但是升级到3.7版本后,items()不再返回列表,而是返回view,该列表只有在对其进行迭代之后才会出现。

如果我尝试从items()初始化列表,它会失败说TypeError: Expecting an object of type list; got an object of type dict_items instead

如何使用Boost Python遍历Python 3+字典?

或者, 如何将字典转换成列表?

3 个答案:

答案 0 :(得分:1)

扩展欧内斯特(Ernest)的评论,答案是将view投射到列表中:

auto myList = list(myDict.items());

如果是代理字典,则需要执行以下操作:

auto myList = list(call_method<object>(myProxyDict.ptr(), "items"));

答案 1 :(得分:0)

您也可以采用这种方法

activity.finish();

答案 2 :(得分:0)

另一种方式:


object theIterable = theObjectDict.keys();
object theIterator = theIterable.attr("__iter__")();

do
{
        try
        {
            object theKey = theIterator.attr("__next__")();
            std::string memberkey = extract< std::string >( theKey );

        }
        catch(...)
        {
          PyObject*theError = PyErr_Occurred();
          if( theError )
          {
              PyObject *ptype, *pvalue, *ptraceback;
              PyErr_Fetch(&ptype, &pvalue, &ptraceback);
              if( ptype == PyExc_StopIteration )
              {
                    PyErr_Clear();
                    break;
              }
          }
          throw;
        }
} while(1);