正在寻找一种更智能的方法将Python列表转换为GList?
我对C->Python交互非常陌生,目前正在用C编写一个小应用程序,它将读取一个文件(使用Python对其进行解析),然后使用解析后的信息执行小Python片段。目前,我感觉很像是在改造轮子,例如,这个功能:正在寻找一种更智能的方法将Python列表转换为GList?,python,c,glib,python-embedding,Python,C,Glib,Python Embedding,我对C->Python交互非常陌生,目前正在用C编写一个小应用程序,它将读取一个文件(使用Python对其进行解析),然后使用解析后的信息执行小Python片段。目前,我感觉很像是在改造轮子,例如,这个功能: typedef gpointer (list_func)(PyObject *obj); GList *pylist_to_glist(list_func func, PyObject *pylist) { GList *result = NULL; if (func =
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;
}
我真的希望以一种更简单/更智能的方式来做这件事,以减少内存泄漏和错误
非常感谢所有意见和建议。我向各位朋友推荐:
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);
}
else
{
PyObject*pSeqfast=PySequence_Fast(pylist,“必须是序列”);
Py_ssize_t n=PySequence_Fast_GET_SIZE(pSeqFast);
对于(Py_ssize_t i=0;i
是的,这似乎是一个非常好的解决方案:)谢谢!