2009-06-19 16 views
2

私はC/C++にはほとんどPython拡張を書いている、と私はこのような機能を持っている:私はこのようなパイソンからそれを呼び出すことができるようにしたいと思いstd :: list <double>をPythonリストに変換する簡単な方法はありますか?

void set_parameters(int first_param, std::list<double> param_list) 
{ 
    //do stuff 
} 

を:

set_parameters(f_param, [1.0, 0.5, 2.1]) 

変換を行うのは比較的簡単ですか?理想的には、たくさんの余分な依存関係を必要としない方法が欲しいですが、余分なものがなければ不可能なものもありますので、大きな問題ではありません。

答えて

0

質問をする前に私が読んでいたはずの文書を見つけたら、思ったよりも痛みが少なくなっていました。私はラッパー関数でPyListオブジェクトを取得できました。そして、それを反復し、必要なベクトルに値をプッシュします。コードは次のようになります。

static PyObject* py_set_perlin_parameters(PyObject* self, PyObject* args) 
{ 
    int octaves; 
    double persistence; 
    PyObject* zoom_list; 
    int zoom_count = 0; 
    std::vector<double> zoom_vector; 

    if(!PyArg_ParseTuple(args, "idO!:set_perlin_parameters", &octaves, &persistence, &PyList_Type, &zoom_list)) 
    { 
     return NULL; 
    } 

    if(!PyList_Check(zoom_list)) 
    { 
     PyErr_SetString(PyExc_TypeError, "set_perlin_parameters: third parameter must be a list"); 
     return NULL; 
    } 

    zoom_count = PyList_Size(zoom_list); 

    for(int i = 0; i < zoom_count; i++) 
    { 
     PyObject* list_val; 
     double val; 

     list_val = PyList_GetItem(zoom_list, i); 

     if(list_val == NULL) 
     { 
      return NULL; 
     } 

     val = PyFloat_AsDouble(list_val); 

     zoom_vector.push_back(val); 
    } 

    set_perlin_parameters(octaves, persistence, zoom_vector); 

    return Py_None; 
} 
0

Boost.Pythonをご覧ください。問題の内容は、Iteratorsチュートリアルの章

ここで、Boost.Pythonはstlのinput_iteratorに変換するstl_input_iteratorテンプレートを提供しています。これはstd :: listを満たすために使用できます。

関連する問題