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