从 PYBIND11 绑定的 c++ 函数的参数中获取单个对象或对象列表
Get either a single object or list of objects from an argument of PYBIND11 binded c++ function
我正在尝试使用 PYBIND 绑定一个接受多个参数和关键字参数的函数。
该函数看起来像这样:
{
OutputSP output;
InputSP input;
if (args.size() == 1)
{
input = py::cast<InputSP>(args[0]);
} else if (args.size() == 2)
{
query = py::cast<OutputSP>(args[0]);
expression = py::cast<InputSP>(args[1]);
}
// TODO: Default values - should be elsewhere?
Flags mode(Flags::FIRST_OPTION);
std::vector<MultiFlags> status({ MultiFlags::COMPLETE });
for (auto& kv : kwargs)
{
auto key_name = py::cast<string>(kv.first);
if (key_name == "flag")
{
mode = py::cast<Flags>(kv.second);
}
else if (key_name == "status")
{
status = py::cast<std::vector<MultiFlags> >(kv.second);
}
}
return method(output, input, mode, status);
}
Flags 和 MultiFlags 的定义是这样的
py::enum_<Flags>(m, "Flags")
.value("FirstOption", Flags::FIRST_OPTION)
.value("SecondOption", Flags::SECOND_OPTION)
.export_values();
py::enum_<MultiFlags>(m, "MultiFlags")
.value("Complete", MultiFlags::COMPLETE)
.value("Incomplete", MultiFlags::INCOMPLETE)
.export_values();
和包装器
m.def("method", &method_wrapper);
现在,如果调用包含
,这应该可以正常工作
status=[MultiFlags.Complete]
我正在寻找一种方法来提前检查 kwarg 的类型,这样我也可以接受包含
的调用
status=MultiFlags.Complete
但在 PYBIND11 文档中找不到任何相关内容。正确的做法是什么?
找到了。
py::cast 在转换失败时抛出 py::cast_error,所以我可以用 try-catch 处理这两个选项:
else if (key_name == "status")
{
try
{
status = py::cast<std::vector<MultiFlags> >(kv.second);
} catch (py::cast_error&)
{
status = { py::cast<MultiFlags>(kv.second) };
}
}
我正在尝试使用 PYBIND 绑定一个接受多个参数和关键字参数的函数。 该函数看起来像这样:
{
OutputSP output;
InputSP input;
if (args.size() == 1)
{
input = py::cast<InputSP>(args[0]);
} else if (args.size() == 2)
{
query = py::cast<OutputSP>(args[0]);
expression = py::cast<InputSP>(args[1]);
}
// TODO: Default values - should be elsewhere?
Flags mode(Flags::FIRST_OPTION);
std::vector<MultiFlags> status({ MultiFlags::COMPLETE });
for (auto& kv : kwargs)
{
auto key_name = py::cast<string>(kv.first);
if (key_name == "flag")
{
mode = py::cast<Flags>(kv.second);
}
else if (key_name == "status")
{
status = py::cast<std::vector<MultiFlags> >(kv.second);
}
}
return method(output, input, mode, status);
}
Flags 和 MultiFlags 的定义是这样的
py::enum_<Flags>(m, "Flags")
.value("FirstOption", Flags::FIRST_OPTION)
.value("SecondOption", Flags::SECOND_OPTION)
.export_values();
py::enum_<MultiFlags>(m, "MultiFlags")
.value("Complete", MultiFlags::COMPLETE)
.value("Incomplete", MultiFlags::INCOMPLETE)
.export_values();
和包装器
m.def("method", &method_wrapper);
现在,如果调用包含
,这应该可以正常工作status=[MultiFlags.Complete]
我正在寻找一种方法来提前检查 kwarg 的类型,这样我也可以接受包含
的调用status=MultiFlags.Complete
但在 PYBIND11 文档中找不到任何相关内容。正确的做法是什么?
找到了。
py::cast 在转换失败时抛出 py::cast_error,所以我可以用 try-catch 处理这两个选项:
else if (key_name == "status")
{
try
{
status = py::cast<std::vector<MultiFlags> >(kv.second);
} catch (py::cast_error&)
{
status = { py::cast<MultiFlags>(kv.second) };
}
}