6

私は(ほとんど)floatのリストをboost pythonのモジュールに渡していますが、一部の要素はNoneオブジェクトです。C ++コードでは、次のようにfloatを抽出しています。

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

list[i]がpythonNoneオブジェクトを指している場合、これは明らかに問題があります。そういうものとして、私はこのようなものを書きました:

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()はNoneと評価されるからです。ただし、これらはどちらも機能しません。Python Noneオブジェクトでそのlist[i]を確認するにはどうすればよいですか?

4

1 に答える 1

6

あなたの最後のアプローチは、比較することでboost::python::api::object()うまくいくはずです。ただし、要素が実際にあるかどうかのみをチェックしますNoneNone値が数値タイプ(文字列など)でもない場合でも、抽出は失敗する可能性があります。

変換が成功したことを確認するために使用する必要があります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 に答える