我在Python扩展模块中有一个函数foo
,它应该向Python返回一个int元组。这可以使用Py_BuildValue
轻松完成:
static PyObject*
foo(PyObject* self, PyObject* args)
{
int a = 0;
int b = 0;
/* calculations and stuff */
PyObject* out = Py_BuildValue("(iii)", a, b, a+b);
Py_INCREF(out);
return out;
}
我想使用PyTuple_Pack
,而不是Py_BuildValue
,这样可以确保返回值确实是一个元组。你知道吗
Python C API documentation表示PyTuple_Pack(3, a, b, a+b)
等价于Py_BuildValue("(iii)", a, b, a+b)
。这两个函数都返回类型为PyPbject*
的新引用。你知道吗
因此,鉴于上述代码
static PyObject*
foo(PyObject* self, PyObject* args)
{
/* ... */
PyObject* out = PyTuple_Pack(3, a, b, a+b);
Py_INCREF(out);
return out;
}
应该这样做,这是不。相反,我得到了一个错误。 我错过了什么?你知道吗
区别在于:
Py_BuildValue("(ii)", a, b)
期望a
和b
是简单的C-int值。你知道吗PyTuple_Pack(2, a, b)
期望a
和b
已经是PyObject
s(而不是C-int)。你知道吗上面写着:
为了使用
PyTuple_Pack
,首先需要将int值转换为Python整数。你知道吗使用} 中插入格式字符串,结果将是一个元组:
Py_BuildValue()
更简单。如果在^{这意味着:如果您至少从两个元素构造元组,则无需担心:
如果只有一个元素,则不同:
或者根本没有元素:
所以只要确保格式字符串中有括号,返回的值将是元组。你知道吗
相关问题 更多 >
编程相关推荐