У меня есть итеративная PyObject
, которую мне нужно передать в качестве списка аргументов для вызываемого Python, ala
xs = [1,2,5,7]
some_function(*xs)
Однако, 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);
}
Я не уверен, нужно ли мне самому увеличивать размер кортежа или нет. Что меня смущает, так это предложение в документации , говорящее:
Кортеж всегда будет расти или уменьшаться в конце.
Я тоже не уверен, что мне нужно увеличить или уменьшить счетчик ссылок для любого из этих объектов.