将C对象添加到Python列表并返回C对象列表

1 投票
1 回答
2243 浏览
提问于 2025-04-17 18:41

我正在为Python编写C扩展。

我想知道如何使用 PyList_SetItem 将一个C对象添加到Python列表中。

举个例子,

我有一个C对象。

Atom *a = (Atom *)(PyTuple_GET_ITEM(tmp2, 0));

我创建了一个列表:

PyObject* MyList = PyList_New(3);

我不太确定在下面的语句中第三个参数应该是什么。

PyObject_SetItem(MyList, 0, a);

另外,我该如何将这个C对象的列表返回给Python。

1 个回答

4

PyList_SetItem这个函数中,第三个参数是要添加到列表中的Python对象,通常这个对象是从C语言的类型转换过来的,就像这个简单的例子所示:

/* This adds one to each item in a list.  For example:
        alist = [1,2,3,4,5]
        RefArgs.MyFunc(alist)
*/
static PyObject * MyFunc(PyObject *self, PyObject *args)
{
   PyObject * ArgList;
   int i;

   PyArg_ParseTuple(args, "O!", &PyList_Type, &ArgList));

   for (i = 0; i < PyList_Size(ArgList); i++)
   {
      PyObject * PyValue;
      long iValue;

      PyValue = PyList_GetItem(ArgList, i);

      /* Add 1 to each item in the list (trivial, I know) */
      iValue = PyLong_AsLong(PyValue) + 1;

      /* SETTING THE ITEM */
      iRetn = PyList_SetItem(ArgList, i, PyLong_FromLong(iValue));

      if (iRetn == -1) Py_RETURN_FALSE;
   }

   Py_RETURN_TRUE;
}

PyObject_SetItem这个函数也很相似。它们的区别在于,PyList_SetItem会“偷走”这个对象的引用,而PyObject_SetItem只是“借用”这个引用。PyObject_SetItem不能用在不可变对象上,比如元组。

撰写回答