【问题标题】:Python bool conversion to C++ (pybind11)Python bool 转换为 C++ (pybind11)
【发布时间】:2018-04-18 04:00:39
【问题描述】:

我正在尝试将 python bool 转换为 C++ bool,以便可以将其用于比较,但未能成功获取它。

这是我到目前为止的代码(注释掉以前的试验以供参考)。任何帮助将不胜感激。到目前为止,它应该打印“True”和“False”,但我无法让它在 C++ if 语句中正确评估。

py::object mwparser = py::module::import("mwparserfromhell");
py::object code = mwparser.attr("parse")(py::str(text));
py::object filtered = code.attr("filter_templates")();

for(auto temp : filtered) {
    //auto type = template_figure_type(temp.attr("name"));
    auto type = template_figure_type(py::str(temp.attr("name")));
   // py::print("G ");
    //py::print(type);
 //   auto type = "";
    if(type != ""){
        try {
            //list.append(type);
            //return list;
            //py::print(py::str(type));

            py::object f = temp.attr("has")("link");
            py::print(py::str(f)); //displays "True" and "False" when it should
            //PyObject *t = Py_True;
           // int tr = PyObject_IsTrue(f);

           // if(py::str(f) == py::str("False")) {
            if(py::str(f).is(py::str("True"))) {
            //if(temp.attr("has")("link")) {
            //if(py::str(f) == py::str("True")){
           // if(0){
                temp.attr("remove")("link");
                bContent_changed = true;
                list.append(temp);
            }
            else {
                py::print("NO");
            }
        } catch (std::domain_error) {
            throw std::domain_error("");
        }
    }

编辑:

if(f == Py_True){

似乎可以工作,但已被弃用。当我尝试使用建议的“f.is(Py_True)”时,它会产生错误error: reference to type 'const pybind11::detail::object_api<pybind11::handle>' could not bind to an rvalue of type 'PyObject *' (aka '_object *') if(f.is(Py_True)){ ^~~~~~~

【问题讨论】:

    标签: c++ c++11 pybind11


    【解决方案1】:

    看来这可以通过对上述代码sn-p进行以下更改来解决

    f.is(Py_True)
    

    应该是

    if(py::str(f).is(py::str(Py_True)))
    

    希望这对可能有相同问题的其他人有所帮助。重要的是要注意,虽然已弃用,但“==”比较 (f == Py_True)仍然有效(暂时)。

    对于那些好奇的(功能)更新代码如下:

    py::object mwparser = py::module::import("mwparserfromhell");
    py::object code = mwparser.attr("parse")(py::str(text));
    py::object filtered = code.attr("filter_templates")();
    
    for(auto temp : filtered) {
        auto type = template_figure_type(py::str(temp.attr("name")));
        if(type != ""){
            try {
    
                py::object f = temp.attr("has")("link");
                py::print(py::str(f)); //displays "True" and "False" when it should
                  if(py::str(f).is(py::str(Py_True))){
                    temp.attr("remove")("link");
                    bContent_changed = true;
                    list.append(temp);
                }
                else {
                    py::print("NO");
                }
            } catch (std::domain_error) {
                throw std::domain_error("");
            }
    }
    

    【讨论】:

      【解决方案2】:

      检查此功能

      int PyBool_Check(PyObject *o) 如果 o 是 PyBool_Type 类型,则返回 true。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-25
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-29
        相关资源
        最近更新 更多