Pybind11如何定义可变参数函数 接收Python传入的任意数量实参
Pybind11捕获任意数量位置参数实现方案
你只需要使用Pybind11内置的特殊参数类型py::args,即可自动捕获Python端传入的所有位置参数,无需调用方手动包装为列表。
修改后的绑定代码
将原有lambda的参数从std::vector<pybind11::object>替换为py::args,该类型支持迭代,可直接转换为你原有逻辑需要的std::vector<pybind11::object>:
namespace py = pybind11; m.def("test", [](py::args args) { // 遍历py::args构造参数列表,传入原有执行逻辑 std::vector<py::object> arg_list(args.begin(), args.end()); return ExecuteFunction("test", arg_list); });
调用效果
修改完成后Python端即可直接按你期望的形式调用,同时支持无参和任意数量位置参数传入:
# 传入多个位置参数 module.test("-2382.430176", "-610.183594", "12.673874") # 无参调用 module.test()
补充说明
py::args本身支持和Python原生args一致的操作:可通过args.size()获取传入参数总数,通过args[i]按下标访问对应位置的参数,如果你不需要转换成std::vector,也可以直接操作py::args对象传入后续逻辑。- 如果后续需要同时捕获关键字参数,可以额外添加
py::kwargs kwargs形式的参数,即可拿到所有传入的键值对参数。
内容的提问来源于stack exchange,提问作者MelonHell
相关产品推荐
相关产品推荐

