8

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

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

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

如果我要使用一个使用关键字参数的函数,那么这个函数将采用三个指向 PyObjects 的指针并返回一个指向 PyObject 的指针 - 例如

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

但是,当我创建模块函数数组时(对于名为“加法器”的函数):

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

工作正常。感觉就像我将浮点数转换为 int 并且仍然必须使用浮点数的非整数部分。如果我没有看到这项工作,我会认为它不会工作。我在这里不明白什么?

此外,我看到一些对 PyCFunctionWithKeywords 的引用,它似乎具有我认为我需要的函数签名,但我的编译器抱怨(发出警告)关于“不兼容的指针类型”。

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

4

1 回答 1

5

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

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

于 2012-04-22T01:47:03.390 回答