我有一个可迭代的PyObject
,我需要将它作为参数列表传递给可调用的Python,ala
xs = [1,2,5,7]
some_function(*x)
但是,PyObject_CallObject
仅允许将元组作为参数的容器传递。
不过,我不确定,创建包含可迭代元素的新元组的最佳方法是什么。这是一个暂定代码:
PyObject* unpack_call(PyObject* callable, PyObject* args) {
PyObject* tuple;
if (PyTuple_Check(args)) {
tuple = args;
} else {
PyObject* iter = PyObject_GetIter(args);
if (!iter) return NULL;
tuple = PyTuple_New(0);
for (Py_ssize_t pos=0; ; ++pos) {
PyObject* arg = PyIter_Next(iter);
if (!arg) break;
PyTuple_SetItem(tuple,pos,arg);
}
}
return PyObject_CallObject(callable,tuple);
}
我不确定是否需要自己增加元组的大小。 documentation中的句子让我感到困惑:
元组最后总是会增长或收缩。
我也不确定是否需要增加或减少这些对象中任何一个的引用计数。
使用PySequence_Tuple
更好,它可以直接从可迭代对象创建元组。可能还有其他类似的选项也可以执行此操作。
如果您确实想用自己的方式来做,那么每次添加PySequence_Tuple
时都需要调用它(或可能按块大小调整它的大小)。什么句子
元组最后总是会增长或收缩。
告诉您,多余的空间位于元组的末尾。
PyTuple_Resize
会窃取参考,因此您无需触摸要添加的项目的参考计数。尽管您应该进行一些错误检查-PyTuple_SetItem
可能引发异常。