我使用(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+字典?
或者, 如何将字典转换成列表?
答案 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);