我正在学习 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" }
工作正常。感觉就像我将一个 float 转换为一个整数,但仍然必须使用 float 的非整数部分。如果我没有看到这项工作,我会认为它行不通。我在这里不明白什么?
此外,我还看到了一些对 PyCFunctionWithKeywords 的引用,它似乎具有我认为我需要的函数签名,但我的编译器提示(发出警告)“不兼容的指针类型”。
PyCFunctionWithKeywords 是否已弃用?如果没有,我是否应该/必须使用它?
最佳答案
如果您的函数处理关键字参数,那么它必须对应于 PyCFunctionWithKeywords。但是,C 不进行重载,并且 PyMethodDef 构建的结构被定义为期望 PyCFunction,而不是完全未经检查的 void *。因此,您必须将 PyCFunctionWithKeywords 转换为 PyCFunction 以阻止编译器报错,仅此而已。
请记住,您还必须在标志中传递 METH_KEYWORDS 以告诉 Python 您的函数具有 PyCFunctionWithKeywords 的签名,而不是 PyCFunction。
关于Python C 扩展 - 为什么将使用关键字参数的方法强制转换为 PyCFunction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10264080/