我正在尝试转换a, b, c, d = iterable
为Python的C / API。
我正在寻找类似于的函数PyArg_ParseTuple
,仅用于可迭代对象。
换句话说,如果存在此类功能,则在PyIter_Parse
或区域内PyObject_ParseIterable
。
有什么秘诀如何实现呢?
不,没有可以帮助您完成此任务的帮助程序功能。
您将不得不花费PyIter_Next()
最多的max
时间来检索值,在无法获取至少一个值时引发异常min
,然后仅从中构建一个元组。
诸如此类(未经测试,大部分是从窃取的PySequence_Tuple()
):
int
PyIter_LimitedTuple(PyObject *v, Py_ssize_t min, Py_ssize_t max)
{
PyObject *it; /* iter(v) */
PyObject *result = NULL;
Py_ssize_t j;
it = PyObject_GetIter(v);
if (it == NULL)
return NULL;
/* allocate space. */
result = PyTuple_New(max);
if (result == NULL)
goto Fail;
/* Fill the tuple. */
for (j = 0; ; ++j) {
PyObject *item = PyIter_Next(it);
if (item == NULL) {
if (PyErr_Occurred())
goto Fail;
break;
}
if (j > max) {
PyErr_Format(PyExc_ValueError,
"too many values to unpack");
goto Fail;
}
PyTuple_SET_ITEM(result, j, item);
}
if (j < min) {
PyErr_Format(PyExc_ValueError,
"need more than %d value to unpack",
j);
goto Fail;
}
/* Cut tuple back if fewer than max items were available. */
if (j < max &&
_PyTuple_Resize(&result, j) != 0)
goto Fail;
Py_DECREF(it);
return result;
Fail:
Py_XDECREF(result);
Py_DECREF(it);
return NULL;
}
然后将生成的元组传递给PyArg_UnpackTuple()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句