2010-03-29 69 views
0

我真的很新C - > Python交互,目前我正在用C編寫一個小應用程序,它將讀取一個文件(使用Python解析它),然後使用解析的信息執行小的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 2010-03-29 03:00:08