如何将 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_proxy
和 kwds_proxy
类型的两个参数覆盖。所以你必须使用两个参数的这种特定的调用方式。
args_proxy
和 kwds_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 包装函数?的主要内容,如果未能解决你的问题,请参考以下文章
argparse - 如何使用 kwargs 或 argv 传递给方法
我可以将 python **kwargs 从 sub 传递给父类吗?