Python C API: 在 c 中调用 python c 方法的问题
Python C API: problems with calling python c method in c
在我的模块中有一个方法将 python 列表除以双
static PyObject *st_div_r(PyObject *self, PyObject *args){
PyObject *pList;
Py_ssize_t n;
double x;
int i;
if (!PyArg_ParseTuple(args, "O!d", &PyList_Type, &pList, &x)) {
PyErr_SetString(PyExc_TypeError, "parameters are wrong.");
return NULL;
}
n = PyList_Size(pList);
for(i=0;i<n;i++)
{
PyList_SetItem(pList,i,Py_BuildValue("d",PyFloat_AsDouble(PyList_GetItem(pList,i))/x));
};
Py_INCREF(pList);
return pList;
}
它是这样工作的
my_mod.st_div_r([1,2,3],0.5)
[2,4,6]
我想在我的模块中的另一种方法中使用 st_div_r,它采用列表的列表,将它的第一个元素除以双精度和 returns 它
static PyObject *det(PyObject *self, PyObject *args){
PyObject *pList;
double d = 2.0;
if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &pList)) {
PyErr_SetString(PyExc_TypeError, "parameters are wrong.");
return NULL;
}
PyList_SetItem(pList,0,st_div_r(pList,(PyList_GetItem(pList,0),Py_BuildValue("d",d))));
Py_INCREF(pList);
return pList;
}
它应该像这样工作
my_mod.det([[1,2],[3,4]])
[[0.5,1],[3,4]]
但这行不通
TypeError: parameters are wrong
所以,问题是如何在 det 中调用 st_div_r 以及将什么作为 self 传递。
将不胜感激任何帮助。谢谢
您必须创建一个 PyTuple 作为您自己函数的第二个参数(st_div_r)!
主要有两种方法!
第一种方式
PyObject *first_list = PyList_GetItem(pList, 0)
//PyObject *divider = Py_BuildValue("d", d)
//PyObject *tuple_with_list_and_divider = Py_BuildValue("(Od)", first_list, divider);
PyObject *tuple_with_list_and_divider = Py_BuildValue("(Od)", first_list, d);
PyObject *list_after_division = st_div_r(pList, tuple_with_list_and_divider)
PyList_SetItem(pList , 0, list_after_division);
第二种方式
PyObject *first_list = PyList_GetItem(pList, 0)
PyObject *divider = Py_BuildValue("d", d)
PyObject *tuple_with_list_and_divider = PyTuple_New(2);
PyTuple_SetItem(tuple_with_list_and_divider, 0, first_list);
PyTuple_SetItem(tuple_with_list_and_divider, 1, divider);
PyObject *list_after_division = st_div_r(pList, tuple_with_list_and_divider)
PyList_SetItem(pList , 0, list_after_division);
在第一个示例中,我忘记了 Py_BuildValue 将 d 转换为 Py_Double。
抱歉我的英语不好!
在我的模块中有一个方法将 python 列表除以双
static PyObject *st_div_r(PyObject *self, PyObject *args){
PyObject *pList;
Py_ssize_t n;
double x;
int i;
if (!PyArg_ParseTuple(args, "O!d", &PyList_Type, &pList, &x)) {
PyErr_SetString(PyExc_TypeError, "parameters are wrong.");
return NULL;
}
n = PyList_Size(pList);
for(i=0;i<n;i++)
{
PyList_SetItem(pList,i,Py_BuildValue("d",PyFloat_AsDouble(PyList_GetItem(pList,i))/x));
};
Py_INCREF(pList);
return pList;
}
它是这样工作的
my_mod.st_div_r([1,2,3],0.5)
[2,4,6]
我想在我的模块中的另一种方法中使用 st_div_r,它采用列表的列表,将它的第一个元素除以双精度和 returns 它
static PyObject *det(PyObject *self, PyObject *args){
PyObject *pList;
double d = 2.0;
if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &pList)) {
PyErr_SetString(PyExc_TypeError, "parameters are wrong.");
return NULL;
}
PyList_SetItem(pList,0,st_div_r(pList,(PyList_GetItem(pList,0),Py_BuildValue("d",d))));
Py_INCREF(pList);
return pList;
}
它应该像这样工作
my_mod.det([[1,2],[3,4]])
[[0.5,1],[3,4]]
但这行不通
TypeError: parameters are wrong
所以,问题是如何在 det 中调用 st_div_r 以及将什么作为 self 传递。 将不胜感激任何帮助。谢谢
您必须创建一个 PyTuple 作为您自己函数的第二个参数(st_div_r)!
主要有两种方法!
第一种方式
PyObject *first_list = PyList_GetItem(pList, 0)
//PyObject *divider = Py_BuildValue("d", d)
//PyObject *tuple_with_list_and_divider = Py_BuildValue("(Od)", first_list, divider);
PyObject *tuple_with_list_and_divider = Py_BuildValue("(Od)", first_list, d);
PyObject *list_after_division = st_div_r(pList, tuple_with_list_and_divider)
PyList_SetItem(pList , 0, list_after_division);
第二种方式
PyObject *first_list = PyList_GetItem(pList, 0)
PyObject *divider = Py_BuildValue("d", d)
PyObject *tuple_with_list_and_divider = PyTuple_New(2);
PyTuple_SetItem(tuple_with_list_and_divider, 0, first_list);
PyTuple_SetItem(tuple_with_list_and_divider, 1, divider);
PyObject *list_after_division = st_div_r(pList, tuple_with_list_and_divider)
PyList_SetItem(pList , 0, list_after_division);
在第一个示例中,我忘记了 Py_BuildValue 将 d 转换为 Py_Double。
抱歉我的英语不好!