【问题标题】:Python C Extension - Why are methods that use keyword arguments cast to PyCFunctionPython C 扩展 - 为什么使用关键字参数的方法转换为 PyCFunction
【发布时间】:2012-04-21 23:54:56
【问题描述】:

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

【问题讨论】:

    标签: python python-c-extension


    【解决方案1】:

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

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

    【讨论】:

    • 所以 METH_KEYWORDS 标志告诉 Python 解释器中的 C 例程之一转换回 PyCFunctionWithKeywords?
    • 是的,就是这样(见PyCFunction_Call()这里svn.python.org/projects/python/branches/pep-0384/Objects/…)。
    • C 语言本身并不保证转换为 void* 的函数指针可以成功地转换回函数指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2017-12-07
    • 2015-10-23
    • 2010-10-07
    • 2012-02-01
    • 2018-07-22
    相关资源
    最近更新 更多