编译 CPython 时出错:C2440 'function':无法从 'PyObject' 转换为 PyObject *'

Error when Compiling CPython: C2440 'function': cannot convert from 'PyObject' to PyObject *'

我刚开始使用 CPython(还有 C),我试图创建一个扩展模块来计算 nCk。但是,我在编译时遇到了这个非常烦人的错误。这是我的代码:

PyObject* combination(PyObject* n, PyObject* k){
    PyObject* output = ONE;
    return PyNumber_TrueDivide(factorial(n), PyNumber_Multiply(factorial(k), factorial(PyNumber_Subtract(n, k))));
}
static PyObject* BezierCurve_combination(PyObject* self, PyObject* args){
    PyObject n, k;

    if (!PyArg_ParseTuple(args, "OO", &n, &k))
        return NULL;
    
    /* This return statement is line 60*/
    return Py_BuildValue("O", combination(n, k));
}

这是错误消息:

(60): error C2440: 'function': cannot convert from 'PyObject' to 'PyObject *'
(60): warning C4024: 'combination': different types for formal and actual parameter 1
(60): warning C4024: 'combination': different types for formal and actual parameter 2

导致此错误的原因是什么?一个类似的程序非常适用于阶乘函数定义(它只包含 1 个 PyObject* 参数。)我该如何解决这个问题?

你的程序中永远不能有这样的 PyObject。它们总是 指向 PyObject

使用 PyObject *n, *k; - 或者,如果有疑问,

PyObject *n;
PyObject *k;

此外,您必须始终检查每个每个[=34]的return值=] 函数在 Python 异常中,除非你只是 return 从你的函数中调用它。因此你可能不会写

return PyNumber_TrueDivide(factorial(n),
       PyNumber_Multiply(factorial(k), factorial(PyNumber_Subtract(n, k))));

你只能写

return PyNumber_TrueDivide(dividend, divisor);

对于内部调用,您必须检查它们是否单独为 NULL,如果它们是 NULL,则表示您必须处理或抛出异常(通过 return从你的函数中获取 NULL)。