2009-06-19 1 views
2

나는 C/C++에 약간의 파이썬 확장을 쓰고 있어요, 나는이 같은 기능을 가지고 : 내가 좋아하는 것 std :: list <double>을 파이썬 목록으로 변환하는 쉬운 방법이 있습니까?

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을 살펴보십시오. 요컨대, Boost.Python은 파이썬의 iterable을 stl의 input_iterator로 변환하는 stl_input_iterator 템플릿을 제공하는데, 이는 std :: list를 채우기 위해 사용될 수있다.

관련 문제