Python 使用Py_BuildValue()在C中创建元组列表

Python 使用Py_BuildValue()在C中创建元组列表,python,c,pyobject,Python,C,Pyobject,我试图使用Py\u BuildValue()在C中创建元组列表 我试图构建的内容如下所示: [ (...), (...), ... ] 我不知道编译时要创建的元组数量,所以这里不能使用一些静态数量 基本上,将Py\u BuildValue()与一个元组一起使用,这就是代码的外观: PyObject * Py_BuildValue("[(siis)]", name, num1, num2, summary); 但这只适用于一个元组。我需要在列表中有多个元组,可以通过for循环添加这些元组。我

我试图使用
Py\u BuildValue()
在C中创建元组列表

我试图构建的内容如下所示:

[ (...), (...), ... ] 
我不知道编译时要创建的元组数量,所以这里不能使用一些静态数量

基本上,将
Py\u BuildValue()
与一个元组一起使用,这就是代码的外观:

PyObject * Py_BuildValue("[(siis)]", name, num1, num2, summary);
但这只适用于一个元组。我需要在列表中有多个元组,可以通过for循环添加这些元组。我如何才能做到这一点?

您可以使用、、和来实现这一点

const Py_ssize_t tuple_length = 4;
const unsigned some_limit = 4;

PyObject *my_list = PyList_New(0);
if(my_list == NULL) {
    // ...
}

for(unsigned i = 0; i < some_limit; i++) {
    PyObject *the_tuple = PyTuple_New(tuple_length);
    if(the_tuple == NULL) {
        // ...
    }

    for(Py_ssize_t j = 0; i < tuple_length; i++) {
        PyObject *the_object = PyLong_FromSsize_t(i * tuple_length + j);
        if(the_object == NULL) {
            // ...
        }

        PyTuple_SET_ITEM(the_tuple, j, the_object);
    }

    if(PyList_Append(my_list, the_tuple) == -1) {
        // ...
    }
}

是否有理由使用
PyLong
PyInt
相比?我有一些整数,如示例中所示,它们是
num1
num2
。它们不是很长,但我假设有一个原因我仍然想像你一样使用
PyLong
?对于以null结尾的
char*string
,我想使用哪个函数?查看文档,我可以使用很多版本的
PyString
。@Fogest:在CPython 3上,
PyInt
不再存在,所有整数都由
PyLong
对象表示。啊,感谢您的解释。PyString区域是否有类似的案例,或者我是否应该选择一个适合我的案例?您可能希望通过转换到CPython 3来查看。这里有一整段关于字符串的内容,这些内容发生了很大的变化。哦,哇,听起来CPython3中没有PyString。好的,我将研究一下如何使用
PyUnicode
。谢谢你的帮助,我已经接受了你的回答,因为它确实解决了我的问题!
[(0, 1, 2, 3), (4, 5, 6, 7), (8, 9, 10, 11), (12, 13, 14, 15)]