使用 PyObject_CallMethod 调用带有可选参数的函数

Posted

技术标签:

【中文标题】使用 PyObject_CallMethod 调用带有可选参数的函数【英文标题】:Calling function with optional arguments with PyObject_CallMethod 【发布时间】:2015-03-11 22:45:08 【问题描述】:

使用 Python C API,我如何调用带有可选参数的函数?

例如,假设有一个 Python 模块 add_module.py 和一个函数 add,如下所示:

def add(a=0, b=0):
  return a + b

add(1, 2) 对应于

PyObject *add_module = PyImport_ImportModule("add_module");
PyObject *result = PyObject_CallMethod(add_module, "add", "ii", 1, 2);

如何使用 Python API 调用 add(b=5) 之类的东西?

谢谢!

【问题讨论】:

【参考方案1】:

在 C 中使用关键字参数调用并不是那么简单,您需要使用 PyObject_Call,这需要 3 个参数:

    PyObject_Call的第一个参数是方法对象 PyObject_Call 的第二个参数是 *args 的空元组 第三个参数是关键字字典

因此我们得到

PyObject *function = PyObject_GetAttrString(add_module, "add");
PyObject *args = PyTuple_New(0);
PyObject *kwargs = Py_BuildValue("s:i", "b", 5)
result = PyObject_Call(function, args, kwargs);

Py_DECREF(kwargs);
Py_DECREF(args);
Py_DECREF(function);

除了必须对前 4 个函数的返回值进行 NULL 检查(为简洁起见,省略)。

【讨论】:

以上是关于使用 PyObject_CallMethod 调用带有可选参数的函数的主要内容,如果未能解决你的问题,请参考以下文章

使用【Feign】调用接口

dubbo泛化调用使用及原理解析

使用汇编代码调用系统调用

如何使用 DFS 了解节点执行(调用前、调用中、调用后)

如何使用POST 方法调用服务

使用反射的方法调用的问题问题,怎么解决