2013-03-11 74 views
0

我正在为python编写C扩展。将C对象添加到Python列表并将C对象的列表返回给python

我想知道如何使用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。

回答

2

的第三个参数PyList_SetItem是要添加到列表中,这通常是从C型转换,如在这个简单的例子Python的对象:

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

+0

如果我想将C对象(Atom)添加到列表中,PyLong_FromLong的等效函数是什么? – user2117235 2013-03-12 14:35:01