【问题标题】:Calling function with optional arguments with PyObject_CallMethod使用 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) 之类的东西?

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-24
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多