我正在学习Python-C扩展,并且很困惑为什么必须将使用关键字参数的方法强制转换为PyCFunctions。
我对PyCFunction的理解是它需要两个指向PyObjects的指针并返回一个指向PyObject的指针 - 例如。
PyObject* myFunc(PyObject* self, PyObject* args)
如果我要使用一个使用关键字参数的函数,那么这个函数将使用三个指向PyObjects的指针并返回一个指向PyObject的指针 - 例如
PyObject* myFunc(PyObject* self, PyObject* args, PyObject* keywordArgs)
但是,当我创建模块函数数组时(对于一个名为'adder'的函数):
{ "adder", (PyCFunction)adder, METH_VARARGS | METH_KEYWORDS, "adder method" }
工作正常。感觉就像我将一个浮点数转换为int并仍然使用浮点数的非整数部分。如果我没有看到这项工作,我会认为它不会起作用。我在这里不理解什么?
另外,我看到一些PyCFunctionWithKeywords的引用,它似乎有我认为我需要的函数签名,但我的编译器抱怨(发出警告)关于'不兼容的指针类型'。
是否弃用了PyCFunctionWithKeywords?如果没有,是否有时间我应该/必须使用它?
答案 0 :(得分:4)
如果您的函数处理关键字参数,那么它必须对应于PyCFunctionWithKeywords。但是,C不会进行重载,并且PyMethodDef构建的结构被定义为期望PyCFunction,而不是完全未经检查的void *。因此,您必须将PyCFunctionWithKeywords转换为PyCFunction以阻止编译器抱怨,这就是全部。
请记住,您还必须在标志中传递METH_KEYWORDS以告诉Python您的函数具有PyCFunctionWithKeywords的签名,而不是PyCFunction。