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 devolver una estructura personalizada como un objeto de Python (que también podría ser None) en pybind11?

Quiero devolver una estructura personalizada como un objeto de Python, que también podría ser nulo. He intentado dos API:
C++
struct Database {
UserModel *get_user1(const std::string &user_name) const;
std::optional<UserModel> get_user2(const std::string &user_name) const;
};

Pero parece que ninguna de estas dos API funciona.
¿Podrías ayudarme por favor?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para devolver una estructura personalizada como un objeto Python, se puede usar pybind11 para crear una clase Python con las variables miembro y funciones adecuadas. Para manejar casos en los que no hay un resultado que devolver, se puede utilizar el objeto None integrado en Python.

    Aquí hay un ejemplo de implementación usando pybind11:

    “`C++
    #include #include #include

    struct UserModel {
    std::string name;
    int age;
    std::string email;
    // … otras variables miembro y funciones
    };

    struct Database {
    UserModel* get_user1(const std::string &user_name) const {
    // … implementación para devolver un puntero UserModel
    }

    std::optional<usermodel> get_user2(const std::string &user_name) const {
        // ... implementación para devolver UserModel como objeto opcional
    }
    

    };

    namespace py = pybind11;

    PYBIND11_MODULE(example, m) {
    py::class_(m, “UserModel”)
    .def(py::init<>())
    .def_readwrite(“name”, &UserModel::name)
    .def_readwrite(“age”, &UserModel::age)
    .def_readwrite(“email”, &UserModel::email);

    py::class_<database>(m, "Database")
        .def(py::init<>())
        .def("get_user1", [](const Database& db, const std::string& user_name) -> py::object {
            UserModel* user = db.get_user1(user_name);
            if (user == nullptr) {
                return py::none();
            }
            return py::cast(*user);
        })
        .def("get_user2", [](const Database& db, const std::string& user_name) -> py::object {
            std::optional<usermodel> user = db.get_user2(user_name);
            if (!user) {
                return py::none();
            }
            return py::cast(*user);
        });
    

    }
    “`

    En este ejemplo, definimos una estructura UserModel con algunas variables miembro y una estructura Database con dos métodos, get_user1 y get_user2, que devuelven objetos UserModel de dos formas diferentes.

    Usamos pybind11 para crear clases Python para estas estructuras y definir funciones que se mapean a los métodos get_user1 y get_user2 de la clase Database. En cada caso, comprobamos si el resultado es nulo antes de devolver un objeto Python.

    El objeto py::none() se utiliza para representar un valor nulo en Python, que se devuelve en casos donde no hay un resultado que devolver.

    Con esta implementación, ahora podemos utilizar la clase Database en Python y obtener objetos UserModel de manera Pythonica.

Comments are closed.