我正在为 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。
我正在为 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。
第三个参数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
不能与不可变对象一起使用,例如元组。