我想做一个C函数,它返回一个元组列表,一个dict列表,或者更好的是,一个我在另一个python模块中定义的类的对象列表。你知道吗
关于C API(«Python/C API»)的文档提到,要构建一个复杂对象,我需要调用Py_BuildValue
,它使用数量可变的参数或Py_VaBuildValue
,它使用va_list
参数。你知道吗
由于C不能动态地用可变数量的参数进行调用,因此我不能使用Py_BuildValue
并且必须使用Py_VaBuildValue
,但是在寻找如何构建va_list
变量时,我找到了There's no ability to fill a va_list explicitly和tells me to make it from a variable parameters function的应答,这与目的不符。。。从测试中,我得到的只是分段错误和核心转储。你知道吗
那么,我该如何使用这些函数呢?你知道吗
您不应该使用这些函数来构建动态大小的数据结构。FAQ说对任意大小的元组使用PyTuple\u Pack而不是Py\u BuildValue,但这也是错误的;我不知道它为什么这么说。PyTuple\u Pack与Py\u BuildValue有相同的varargs问题。你知道吗
要从C构建可变长度元组,请使用^{} 构造所需长度的未初始化元组,然后循环索引并使用^{} 设置元素。是的,这改变了元组。
PyTuple_SET_ITEM
是唯一安全的用于初始化尚未暴露于其他代码的新元组。另外,请注意PyTuple_SET_ITEM
窃取了对新元素的引用。你知道吗例如,要构建从0到n-1的整数元组:
要从C构建可变长度的列表,可以使用
PyList_New
和PyList_SET_ITEM
执行相同的操作,也可以使用PyList_New(0)
构建空列表,并使用PyList_Append
附加项,就像在没有列表理解或序列乘法的情况下在Python中使用[]
和append
。你知道吗相关问题 更多 >
编程相关推荐