2009-06-19 5 views
2

J'écris un peu l'extension Python en C/C++, et j'ai une fonction comme ceci:Existe-t-il un moyen facile de convertir une liste std :: list <double> en une liste Python?

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

Je voudrais pouvoir l'appeler de Python comme ceci:

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

Existe-t-il un moyen raisonnablement facile de faire cette conversion? Idéalement, je voudrais un moyen qui ne nécessite pas beaucoup de dépendances supplémentaires, mais certaines choses ne sont tout simplement pas possibles sans trucs supplémentaires, donc ce n'est pas un gros problème.

Répondre

0

Il s'est avéré être moins de douleur que je pensais, une fois que j'ai trouvé les documents que j'aurais probablement dû lire avant de poser la question. J'ai été en mesure d'obtenir un objet PyList dans ma fonction d'encapsulation, puis je l'ai simplement parcouru et poussé les valeurs sur le vecteur dont j'avais besoin. Le code ressemble à ceci:

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

Jetez un coup d'œil à Boost.Python. Le point que vous avez demandé est couvert dans le chapitre Iterators du tutoriel

Le point est, Boost.Python fournit le modèle stl_input_iterator qui convertit l'iterable de Python en input_iterator de stl, qui peut être utilisé pour remplir votre liste std :: list.

Questions connexes