Python C扩展-为什么将使用关键字参数的方法强制转换为PyCFunction


问题内容

我正在学习Python-C扩展,并对为什么必须将使用关键字参数的方法强制转换为PyCFunctions感到困惑。

我对PyCFunction的理解是,它需要两个指向PyObjects的指针并返回一个指向PyObject的指针-例如

 PyObject* myFunc(PyObject* self, PyObject* args)

如果我要使用使用关键字参数的函数,则此函数将使用三个指向PyObject的指针,并返回指向PyObject的单个指针-例如

 PyObject* myFunc(PyObject* self, PyObject* args, PyObject* keywordArgs)

但是,当我创建模块函数数组(用于名为“ adder”的函数)时:

{ "adder", (PyCFunction)adder, METH_VARARGS | METH_KEYWORDS, "adder method" }

工作良好。感觉就像我将浮点数转换为int并仍然使用浮点数的非整数部分一样。如果我没有看到这项工作,我会以为那是行不通的。我在这里不明白什么?

另外,我看到了一些对PyCFunctionWithKeywords的引用,这些引用似乎具有我认为我需要的功能签名,但是我的编译器抱怨(发出警告)“不兼容的指针类型”。

PyCFunctionWithKeywords是否已弃用?如果没有,我是否应该/必须使用它?


问题答案:

如果您的函数处理关键字参数,那么它必须对应于PyCFunctionWithKeywords。但是,C不会重载,并且PyMethodDef构建的结构被定义为期望有PyCFunction,而不是完全未经检查的void
*。因此,您必须将PyCFunctionWithKeywords强制转换为PyCFunction才能停止编译器抱怨。

请记住,您还必须在标志中传递METH_KEYWORDS,以告诉Python您的函数具有PyCFunctionWithKeywords签名,而不是PyCFunction。