如何在boost.python中指定命名参数的值?

时间:2011-07-07 14:30:40

标签: boost-python

我想将用python编写的函数嵌入到c ++代码中。
我的python代码是:test.py

def func(x=None, y=None, z=None):  
  print x,y,z  

我的c ++代码是:

module = import("test");  
namespace = module.attr("__dict__");  

//then i want to know how to pass value 'y' only.  
module.attr("func")("y=1") // is that right?

2 个答案:

答案 0 :(得分:1)

我不确定Boost.Python如前所述实现了**解除引用运算符,但您仍然可以使用Python C-API来执行您所关注的方法as described here

以下是该解决方案的原型:

//I'm starting from where you should change
boost::python::object callable = module.attr("func");

//Build your keyword argument dictionary using boost.python
boost::python::dict kw;
kw["x"] = 1;
kw["y"] = 3.14;
kw["z"] = "hello, world!";

//Note: This will return a **new** reference
PyObject* c_retval = PyObject_Call(callable.ptr(), NULL, kw.ptr());

//Converts a new (C) reference to a formal boost::python::object
boost::python::object retval(boost::python::handle<>(c_retval));

将返回值从PyObject_Call转换为正式boost::python::object后,您可以从函数中返回它,也可以忘记它,PyObject_Call返回的新引用将被自动删除。

有关将PyObject*包装为boost::python::object的更多信息,请查看Boost.Python教程。 More precisely, at this link, end of the page

答案 1 :(得分:0)

理论答案(没时间尝试自己: - |):

boost::python::dict kw;
kw["y"]=1;
module.attr("func")(**kw);