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

lwx*_*ted 3 c c++ python python-2.7 python-3.x

使用Python C API,如何使用可选参数调用函数?

例如,假设有一个Python模块add_module.py,其函数add类似于:

def add(a=0, b=0):
  return a + b
Run Code Online (Sandbox Code Playgroud)

add(1, 2) 对应于

PyObject *add_module = PyImport_ImportModule("add_module");
PyObject *result = PyObject_CallMethod(add_module, "add", "ii", 1, 2);
Run Code Online (Sandbox Code Playgroud)

我怎么称呼add(b=5)使用Python API?

谢谢!

Ant*_*ala 5

使用关键字参数调用并不是那么简单,你需要做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);
Run Code Online (Sandbox Code Playgroud)

除了必须从4个第一功能NULL检查的返回值(为简洁起见省略).