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

时间:2012-04-21 23:54:56

标签: python python-c-extension

我正在学习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?如果没有,是否有时间我应该/必须使用它?

1 个答案:

答案 0 :(得分:4)

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

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