6

我正在将一个(大部分)浮点列表传递给 boost python 中的一个模块,一些元素是 None 对象。在 C++ 代码中,我像这样提取浮点数:

for(i=0;i<boost::python::len(list) - window_len + 1;i++) {
  double value = boost::python::extract<double>(list[i]);
}

当 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]);
}

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]);
}

因为显然 boost::python::api::object() 评估为无。但是,这些都不起作用。如何在 python None 对象中检查 list[i] ?

4

1 回答 1

6

你的最后一种方法,比较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
}
于 2012-11-21T05:25:24.880 回答