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

标签 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" }

工作正常。感觉就像我将一个 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/

相关文章:

python - 如何在保留顺序的同时查询列表

python - 我怎样才能在某些条件下获得 numpy 数组索引

python - ValueError : No 'serving_default' in the SavedModel's SignatureDefs. 可能的值为 'name_of_my_model'

python - 如何将 python 对象传递给 C 扩展并在其中调用其方法?

gcc - "...can' t 在使用 gcc 编译 Python C 扩展时找出...的架构类型问题

包中的 Python C 扩展 - 不起作用?

python - 如何在 Cython 中创建固定长度、可变的 Python 对象数组?

python - pyodbc.ProgrammingError : ('The SQL contains 0 parameter markers, but 3 parameters were supplied' , 'HY000' )

python - 如何在python中对集合进行排序?

python - 如何从 C 的 PyObject 类型的函数将值从 C 返回到 python?