Я пытаюсь понять, как в модулях расширения C иметь переменную (и, возможно,) довольно большое количество аргументов функции.
Читая о PyArg_ParseTuple , кажется, вы должны знать, сколько принимать, некоторые обязательные, а некоторые необязательные, но все со своей собственной переменной. Я надеялся, что PyArg_UnpackTuple сможет справиться с этим, но, похоже, он просто выдает мне ошибки шины, когда я пытаюсь использовать его, что кажется неправильным.
В качестве примера возьмем следующий код Python, который можно было бы преобразовать в модуль расширения (на C).
def hypot(*vals):
if len(vals) !=1 :
return math.sqrt(sum((v ** 2 for v in vals)))
else:
return math.sqrt(sum((v ** 2 for v in vals[0])))
Это может быть вызвано с любым количеством аргументов или повторено, гипотеза (3,4,5)
, гипотеза ([3,4,5])
и гипотеза (* [3,4,5])
все дают один и тот же ответ.
Начало моей функции C выглядит так
static PyObject *hypot_tb(PyObject *self, PyObject *args) {
// lots of code
// PyArg_ParseTuple or PyArg_UnpackTuple
}
Многие думают, что yasar11732 . Здесь для следующего специалиста - полностью рабочий модуль расширения (_toolboxmodule.c), который просто принимает любые числовые или целочисленные аргументы и возвращает список, составленный из этих аргументов (с плохим названием). Игрушка, но показывает, что нужно сделать.
#include
int ParseArguments(long arr[],Py_ssize_t size, PyObject *args) {
/* Get arbitrary number of positive numbers from Py_Tuple */
Py_ssize_t i;
PyObject *temp_p, *temp_p2;
for (i=0;i
В python это:
>>> import _toolbox
>>> _toolbox.hypot(*range(4, 10))
[4, 5, 6, 7, 8, 9]