Ищете более разумный способ преобразования списка Python в GList?

Я действительно новичок в взаимодействии 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;
}

Я действительно хотел бы сделать это проще/умнее, менее подверженным утечкам памяти и ошибкам.

Все комментарии и предложения приветствуются.


person Hobblin    schedule 29.03.2010    source источник


Ответы (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);
}
person Alex Martelli    schedule 29.03.2010
comment
Да, это кажется действительно отличным решением :) Спасибо! - person Hobblin; 29.03.2010