1

我正在为 python 编写 C 扩展。

我想知道如何使用PyList_SetItem. 例如,

我有一个 C 对象。

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

我列了一个清单:

PyObject* MyList = PyList_New(3);

我不确定以下语句中的第三个参数必须是什么。

PyObject_SetItem(MyList, 0, a);

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

4

1 回答 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不能与不可变对象一起使用,例如元组。

于 2013-03-11T15:26:52.893 回答