Модуль расширения Python с переменным количеством аргументов

Я пытаюсь понять, как в модулях расширения 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]

13
задан Community 23 May 2017 в 12:09
поделиться