NCA*_*gie 5 python boost boost-python
我正在将(大多数)浮动列表传递给boost python中的模块,某些元素是None对象。在C ++代码中,我像这样提取浮点数:
for(i=0;i<boost::python::len(list) - window_len + 1;i++) {
double value = boost::python::extract<double>(list[i]);
}
Run Code Online (Sandbox Code Playgroud)
当list [i]指向python None对象时,这显然是有问题的。因此,我写了这样的东西:
for(i=0;i<boost::python::len(list) - window_len + 1;i++) {
if(list[i] == NULL) continue;
double value = boost::python::extract<double>(list[i]);
}
Run Code Online (Sandbox Code Playgroud)
和
for(i=0;i<boost::python::len(list) - window_len + 1;i++) {
if(list[i] == boost::python::api::object()) continue;
double value = boost::python::extract<double>(list[i]);
}
Run Code Online (Sandbox Code Playgroud)
因为显然boost :: python :: api :: object()的计算结果为无。但是,这些都不起作用。如何检查python None对象中的list [i]?
与进行比较的最后一种方法boost::python::api::object()应该可以工作。但是,它仅检查元素是否实际None。如果该值既不None是数字类型(例如字符串),提取仍将失败。
您应该使用check()来确保转换成功(如果失败,则无论如何使用该值,模块都会抛出异常):
for( size_t i=0, len=boost::python::len(list); i<len; ++i ) {
boost::python::extract<double> value(list[i]);
if( !value.check() ) continue; // check if the conversion was successful
double d = value; // now you can use value as double
}
Run Code Online (Sandbox Code Playgroud)