我是Python/capi的新手,虽然我有一些基本的函数可以工作,但我正在努力解决这个问题。在
PyObject* sum_elements(PyObject*, PyObject *o)
{
Py_ssize_t n = PyList_Size(o);
long total = 0;
if (n < 0)
{
return PyLong_FromLong(total);
}
PyObject* item;
for (int i = 0; i < n; i++)
{
item = PyList_GetItem(o, i);
if (!PyLong_Check(item)) continue;
total += PyLong_AsLong(item);
}
return PyLong_FromLong(total);
}
基本上这是doc页面上介绍的功能。它应该接收一个python列表并返回所有元素的总和。如果我传递了一个列表,如果我传递了其他东西,但是我得到了错误消息,那么这个函数工作得很好
^{pr2}$这种情况应该由if (n<0)
语句处理,如果传递的对象不是列表,则n是-1。在
我用以下方式绑定函数:
static PyMethodDef example_module_methods[] = {
{ "sum_list", (PyCFunction)sum_elements, METH_O, nullptr},
{ nullptr, nullptr, 0, nullptr }
};
谢谢。在
错误
实际发生在
^{pr2}$因为}。请参见^{} 中
PyList_Size
有一个额外的检查来查看对象是否为list类型,如果不是,它将调用PyErr_BadInternalCall
API来引发{PyList_Size
的实现PyErr_BadInternalCall是
PyErr_SetString(PyExc_SystemError, message)
的简写,其中message指示使用非法参数调用了内部操作(例如Python/capi函数)。在您应该使用
PyList_Check
API来检查对象是否属于list
类型。根据文档,如果对象是列表对象或列表类型的子类型的实例,则返回true。一旦添加了这个额外的检查,函数调用将引发
当提供
list
类型以外的参数时。在相关问题 更多 >
编程相关推荐