python支持可变数量的参数_具有可变数量参数的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])))

这可以用任意数量的参数调用或迭代,hypot(3,4,5),hypot([3,4,5])和hypot(* [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

temp_p = PyTuple_GetItem(args,i);

if(temp_p == NULL) {return NULL;}

/* Check if temp_p is numeric */

if (PyNumber_Check(temp_p) != 1) {

PyErr_SetString(PyExc_TypeError,"Non-numeric argument.");

return NULL;

}

/* Convert number to python long and than C unsigned long */

temp_p2 = PyNumber_Long(temp_p);

arr[i] = PyLong_AsUnsignedLong(temp_p2);

Py_DECREF(temp_p2);

}

return 1;

}

static PyObject *hypot_tb(PyObject *self, PyObject *args)

{

Py_ssize_t TupleSize = PyTuple_Size(args);

long *nums = malloc(TupleSize * sizeof(unsigned long));

PyObject *list_out;

int i;

if(!TupleSize) {

if(!PyErr_Occurred())

PyErr_SetString(PyExc_TypeError,"You must supply at least one argument.");

return NULL;

}

if (!(ParseArguments(nums, TupleSize, args)) {

free(nums);

return NULL;

}

list_out = PyList_New(TupleSize);

for(i=0;i

PyList_SET_ITEM(list_out, i, PyInt_FromLong(nums[i]));

free(nums);

return (PyObject *)list_out;

}

static PyMethodDef toolbox_methods[] = {

{ "hypot", (PyCFunction)hypot_tb, METH_VARARGS,

"Add docs here

"},

// NULL terminate Python looking at the object

{ NULL, NULL, 0, NULL }

};

PyMODINIT_FUNC init_toolbox(void) {

Py_InitModule3("_toolbox", toolbox_methods,

"toolbox module");

}

在python中它是:

>>> import _toolbox

>>> _toolbox.hypot(*range(4, 10))

[4, 5, 6, 7, 8, 9]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值