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

Posted

技术标签:

【中文标题】如何将 kwargs 传递给 boost-python 包装函数?【英文标题】:How do you pass kwargs to a boost-python wrapped function? 【发布时间】:2011-06-28 01:49:50 【问题描述】:

我有一个带有这个签名的 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 字典中传递我的示例中的选项

我看到一个post 建议使用**options 语法(这太酷了!):

python_func(message, arguments, **options)

不幸的是,这会导致

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

感谢您提供的任何帮助。

【问题讨论】:

【参考方案1】:

经过一番调查,发现对象函数调用运算符被 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)

希望对你有帮助……

【讨论】:

哇,我不知道 * 和 ** 重载,这是让 boost::python 令人钦佩的微小细节之一。 请注意,即使只使用 kwargs,也需要将元组作为第一个参数。但它可以是空的:python_func(*boost::python::tuple(), **options).

以上是关于如何将 kwargs 传递给 boost-python 包装函数?的主要内容,如果未能解决你的问题,请参考以下文章

将 kwargs 传递给 Django 过滤器

argparse - 如何使用 kwargs 或 argv 传递给方法

“kwargs”如何隐式传递给变量?

我可以将 python **kwargs 从 sub 传递给父类吗?

如何从视图将值传递给 Django Form init 方法?

将kwargs传递给django管理表单