Vous cherchez une façon plus intelligente de convertir une liste de Python à un GList?
-
22-09-2019 - |
Question
Je suis vraiment nouveau à C -> interaction Python et je écris actuellement une petite application en C qui va lire un fichier (en utilisant Python pour l'analyser), puis en utilisant les informations analysées pour exécuter de petits extraits de Python. En ce moment, je me sens très bien comme je suis réinventer la roue, par exemple cette fonction:
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;
}
Je voudrais vraiment faire cela d'une manière plus facile / plus intelligent moins sujette à des fuites de mémoire et les erreurs.
Tous les commentaires et suggestions sont appréciés.
La solution
Je recommande PySequence_Fast et les amis:
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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow