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

时间:2015-03-11 22:45:08

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

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

例如,假设有一个函数add_module.py的Python模块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 个答案:

答案 0 :(得分:5)

使用关键字参数进行调用并非直截了当,而且您需要执行PyObject_Call,这需要3个参数:

  1. PyObject_Call的第一个参数是方法对象
  2. PyObject_Call的第二个参数是* args
  3. 的空元组
  4. 第三个参数是关键字词典
  5. 因此我们得到了

    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);
    

    除了必须 NULL - 检查4个第一个函数的返回值(为简洁起见省略)。