【问题标题】:Is there an easy way to convert an std::list<double> to a Python list?有没有一种简单的方法可以将 std::list<double> 转换为 Python 列表?
【发布时间】:2009-06-19 18:39:23
【问题描述】:

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

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

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

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

有没有一种相当简单的方法来进行这种转换?理想情况下,我想要一种不需要大量额外依赖项的方法,但有些事情没有额外的东西是不可能的,所以这没什么大不了的。

【问题讨论】:

    标签: python c stl


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      当我找到在我提出问题之前我可能应该阅读的文档后,结果发现并没有我想象的那么痛苦。我能够在我的包装函数中获得一个 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-24
        • 2019-03-10
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2021-12-25
        • 2011-05-15
        • 2020-05-02
        相关资源
        最近更新 更多