有没有一种简单的方法将std :: list <double>转换为Python列表?</double>

时间:2009-06-19 18:39:23

标签: python c stl

我正在用C / C ++编写一个小的Python扩展,我有一个这样的函数:

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

我希望能够像Python一样从Python中调用它:

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

是否有一种相当简单的转换方式?理想情况下,我想要一种不需要额外依赖的方法,但是如果没有额外的东西,有些事情是不可能的,所以这并不是一件大事。

2 个答案:

答案 0 :(得分:0)

看看Boost.Python。您已问过的问题已在教程的Iterators章节中介绍

重点是,Boost.Python提供了stl_input_iterator模板,它将Python的iterable转换为stl的input_iterator,可以用来填充你的std :: list。

答案 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;
}