如何将kwargs传递给boost-python封装的函数?

18

我有一个 Python 函数,其签名如下:

def post_message(self, message, *args, **kwargs):

我想从C++中调用函数并向其传递一些kwargs参数。调用函数不是问题,问题在于如何传递kwargs参数。以下是一个无法工作的样例:

std::string message("aMessage");
boost::python::list arguments;
arguments.append("1");

boost::python::dict options;
options["source"] = "cpp";

boost::python::object python_func = get_python_func_of_wrapped_object()
python_func(message, arguments, options)

当我运行这段代码时,在pdb中我得到了以下结果(这不是我想要的):

messsage = aMessage
args = (['1'], {'source': 'cpp'})
kwargs = {}

在我的示例中,如何将选项传递到**kwargs字典中?

我看过一个帖子建议使用**options语法(这是多酷啊!):

python_func(message, arguments, **options)

不幸的是,这会导致

TypeError: No to_python (by-value) converter found for C++ type: class boost::python::detail::kwds_proxy

非常感谢您能提供的任何帮助。

1个回答

21
经过一些调查,发现当类型为args_proxykwds_proxy的两个参数覆盖了对象函数调用运算符时,必须使用这种特定的两个参数的调用方式。 args_proxykwds_proxy是由*重载生成的,这非常好。
此外,第一个参数必须是元组类型,以便Python解释器正确处理*args参数。
最终的示例代码如下:
boost::python::list arguments;
arguments.append("aMessage");
arguments.append("1");

boost::python::dict options;
options["source"] = "cpp";

boost::python::object python_func = get_python_func_of_wrapped_object()
python_func(*boost::python::tuple(arguments), **options)

希望这能有所帮助...


3
哇,我不知道关于*和**重载的事情,这些微小的细节使boost::python令人钦佩。 - eudoxos
3
请注意,即使只使用kwargs,第一个参数作为元组也是必需的。它可以为空:python_func(*boost::python::tuple(), **options) - luator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接