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

标签 python c++ c python-2.7 python-3.x

使用 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) 的东西?

谢谢!

最佳答案

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

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

因此我们得到

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 检查(为简洁起见省略)。

关于python - 使用 PyObject_CallMethod 调用带有可选参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28998817/

相关文章:

python - 变量和函数帮助//Python

python - 尝试创建 Panda df 的词袋

python - 可扩展的偏向数生成器 - Python

c - 如何在 C 中创建字符串数组?

c - 列表,添加到最后,C 编程代码

c - 串行 COM 端口未打开

python - 在OSX上安装python软件包后找不到软件包

c++ - 使用蒙特卡洛的 rand() 方法找到 "pi"

c++ - UBUNTU C 的 USB 到串行通信问题

C++ 通过 nullptrs 标记要在 STD 列表中删除的对象