Есть ли простой способ конвертировать std :: list <double>в список Python? - PullRequest
2 голосов
/ 19 июня 2009

Я пишу небольшое расширение Python на C / C ++, и у меня есть такая функция:

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

Я хотел бы иметь возможность вызывать его из Python так:

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

Есть ли достаточно простой способ сделать это преобразование? В идеале мне бы хотелось, чтобы не требовалось много дополнительных зависимостей, но некоторые вещи просто невозможны без дополнительных вещей, так что это не так уж сложно.

Ответы [ 2 ]

0 голосов
/ 20 июня 2009

Оказалось, что это было меньше боли, чем я думал, когда я нашел документы, которые мне, вероятно, следовало прочитать, прежде чем я задал вопрос. Я смог получить объект 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 голосов
/ 19 июня 2009

Взгляните на Boost.Python . Вопрос, который вы задали, описан в Итераторах главы руководства

Дело в том, что Boost.Python предоставляет шаблон stl_input_iterator, который преобразует итерируемые Python в input_iterator stl, который можно использовать для заполнения вашего std :: list.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...