可以从C或其他语言空间调用带有*args/**kwargs参数的Python函数吗?



取一个规范的Python函数,定义如下:

def foo(*args, **kwargs):
  print("args:", len(args))
  for i in args:
    print(i)
  print("kwargs:", len(kwargs))
  for k in kwargs:
    print(k, kwargs[k])

从Python调用这个函数可能看起来像:

some_list = ['one', 'two', 'three']
some_kwords = { "name1" : "alice", "name2" : "bob", "name3" : "carol" }
foo(*some_list, **some_kwords)

Python C API是否提供从C空间调用此函数的某种方法?如何将以上三行转换为等效的C ?

请注意,在类似的问题中,使用boost::python, c++调用这个关键字参数函数的语法与Python几乎相同,这是一个相当大的技巧!

要在Python/C中调用具有任意位置和关键字参数的函数,相当于function(*args, **kwds)语法,请使用PyObject_Call:

/* error checking omitted for brevity */
PyObject *some_list = PyObject_BuildValue("(sss)", "one", "two", "three");
PyObject *some_kwords = PyObject_BuildValue("{s:s,s:s,s:s}",
                          "name1", "alice", "name2", "bob", "name3", "carol");
PyObject *ret = PyObject_Call(foo, some_list, some_kwords);
Py_DECREF(some_list);
Py_DECREF(some_kwords);

最新更新