2010-03-29 2 views
0

저는 C -> Python 상호 작용을 처음 접했고 현재 C로 파일을 읽고 (구문 분석을 위해 Python을 사용하는) 작은 파이썬 스 니펫을 실행하기 위해 구문 분석 된 정보를 사용하는 작은 응용 프로그램을 작성 중입니다.Python 목록을 GList로 변환하는 똑똑한 방법을 찾고 계십니까?

typedef gpointer (list_func)(PyObject *obj); 

GList *pylist_to_glist(list_func func, PyObject *pylist) 
{ 
    GList *result = NULL; 
    if (func == NULL) 
    { 
     fprintf(stderr, "No function definied for coverting PyObject.\n"); 
    } 
    else if (PyList_Check(pylist)) 
    { 
     PyObject *pIter = PyObject_GetIter(pylist); 
     PyObject *pItem; 

     while ((pItem = PyIter_Next(pIter))) 
     { 
      gpointer obj = func(pItem); 
      if (obj != NULL) result = g_list_append(result, obj); 
      else fprintf(stderr, "Could not convert PyObject to C object.\n"); 
      Py_DECREF(pItem); 
     } 
     Py_DECREF(pIter); 
    } 
    return result; 
} 

정말 메모리 누수 및 오류에 덜이 심한 쉽게/스마트 한 방법으로이 작업을 수행하고 싶습니다 : 나는 예를 들어,이 기능을 바퀴를 개혁 것 같은 순간 난 아주 많이 느끼고있다.

모든 의견 및 제안을 부탁드립니다.

답변

1

내가 추천 PySequence_Fast 친구 :

else 
{ 
    PyObject *pSeqfast = PySequence_Fast(pylist, "must be a sequence"); 
    Py_ssize_t n = PySequence_Fast_GET_SIZE(pSeqFast); 

    for(Py_ssize_t i = 0; i < n ; ++i) 
    { 
     gpointer obj = func(PySequence_Fast_GET_ITEM(pSeqfast, i)); 
     if (obj != NULL) result = g_list_append(result, obj); 
     else fprintf(stderr, "Could not convert PyObject to C object.\n"); 
    } 
    Py_DECREF(pSeqfast); 
} 
+0

그래, 정말 좋은 솔루션 : 감사합니다 것 같아! – Hobblin