Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从PYBIND11绑定的c+;的参数中获取单个对象或对象列表+;功能_Python_C++_Pybind11 - Fatal编程技术网

Python 从PYBIND11绑定的c+;的参数中获取单个对象或对象列表+;功能

Python 从PYBIND11绑定的c+;的参数中获取单个对象或对象列表+;功能,python,c++,pybind11,Python,C++,Pybind11,我试图用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

我试图用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);
}
现在,如果调用包含

status=[MultiFlags.Complete]
我正在寻找一种方法来提前检查kwarg的类型,这样我也可以接受一个包含

status=MultiFlags.Complete
但在PYBIND11文档中找不到任何相关内容。正确的方法是什么?

找到了

当转换失败时,py::cast抛出py::cast\u错误,因此我可以使用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) };
    }
}
else if(key_name==“status”)
{
尝试
{
状态=py::铸造(千伏秒);
}捕获(py::cast\u错误&)
{
状态={py::cast(千伏秒)};
}
}
status=MultiFlags.Complete
else if (key_name == "status")
{
    try
    {
        status = py::cast<std::vector<MultiFlags> >(kv.second);
    } catch (py::cast_error&)
    {
        status = { py::cast<MultiFlags>(kv.second) };
    }
}