将可迭代对象转换为python C api中的元组

问题描述 投票:0回答:1

我有一个可迭代的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中的句子让我感到困惑:

元组最后总是会增长或收缩。

我也不确定是否需要增加或减少这些对象中任何一个的引用计数。

python-3.x python-c-api
1个回答
0
投票

使用PySequence_Tuple更好,它可以直接从可迭代对象创建元组。可能还有其他类似的选项也可以执行此操作。

如果您确实想用自己的方式来做,那么每次添加PySequence_Tuple时都需要调用它(或可能按块大小调整它的大小)。什么句子

元组最后总是会增长或收缩。

告诉您,多余的空间位于元组的末尾。

PyTuple_Resize会窃取参考,因此您无需触摸要添加的项目的参考计数。尽管您应该进行一些错误检查-PyTuple_SetItem可能引发异常。

© www.soinside.com 2019 - 2024. All rights reserved.