python - 正在寻找一种更智能的方法将 Python 列表转换为 GList?

标签 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 == 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;
}

我真的很想以一种更简单/更智能的方式来做到这一点,不易出现内存泄漏和错误。

欢迎所有意见和建议。

最佳答案

我推荐PySequence_Fast和 friend 们:

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);
}

关于python - 正在寻找一种更智能的方法将 Python 列表转换为 GList?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2535448/

相关文章:

python - 如果需要,如何通过输入虚拟行来获取分组对角线值?

c - 访问指向字符串的指针数组

c - 使用 GLib 中的 GHashTable?

c - 如何在不知道其长度的情况下迭代 char**

python - fatal error :在“pip install mysql-python”命令后生成了#include <stdio.h>

python - 将函数作为参数传递给其他函数 python

c - Scanf 程序访问被拒绝

c - Arduino MIDI Controller menuUsed 未在此范围内声明

c - 使用 glib 和 gtk+ 通过 USB 控制 ftdi 设备

python - glob() 收到意外的关键字参数 'recursive'