在Boost python中评估None对象

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]?

Ano*_*ard 5

与进行比较的最后一种方法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)