es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo realizar el envío a través de py::dict en C++ pasando desde pybind11.

Intento pasar una estructura de diccionario (unordered_map) de Python a C++ mediante pybind11. En el lado de Python estoy tratando de hacer lo siguiente:

v1 = {1:3.0, 2:4.0}
v2 = {7:13.0, 8:14.0, 15:22.0}

data = {'ab':v1, 'bz':v2}
cpp_run(data)

En el lado de C++, tengo lo siguiente:

#include <iostream>
#include <pybind11 pybind11.h="">
#include <pybind11 numpy.h="">
#include <pybind11 stl.h="">

namespace py = pybind11;

void cpp_run(py::dict& results) {
    for (auto it : results) {
        const std::string& name = reinterpret_cast<const std::string&&="">(it.first);
        const py::dict& values = reinterpret_cast<const py::dict&&="">(it.second);

        for (auto iter : values) {
            const int& id = reinterpret_cast<const int&&="">(iter.first);
            const double& value = reinterpret_cast<const double&&="">(iter.second);
            std::cout << "name:" << name << ", id:" << id << ", value:" << value << std::endl;
        }
    }
}

Imprime datos basura. Usé reinterpret_cast para satisfacer al compilador de Visual Studio.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Los datos basura que se imprimen podrían ser el resultado de una incorrecta conversión de tipos en el código de C++. py::dict ya es una estructura de diccionario en el lado de C++, por lo que no es necesario reinterpretar_cast. De manera similar, los pares clave-valor en el diccionario interno deberían ser casteado como const int& y const double&, respectivamente.

    El código modificado de C++ que debería funcionar correctamente es:

    #include <iostream>
    #include <pybind11 pybind11.h="">
    #include <pybind11 numpy.h="">
    #include <pybind11 stl.h="">
    
    namespace py = pybind11;
    
    void cpp_run(py::dict& results) {
    
        for (const auto& it : results) {
            const std::string& name = it.first.cast<std::string>();
            const py::dict& values = it.second.cast<py::dict>();
    
            for (const auto& iter : values) {
                const int& id = iter.first.cast<int>();
                const double& value = iter.second.cast<double>();
                std::cout << "name:" << name << ", id:" << id << ", value:" << value << std::endl;
            }
        }
    }
    

    Este código debería imprimir correctamente los valores de name, id y value.

Comments are closed.