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.

En el archivo “spanish.pybind11” (o en tu traducción preferida de “spanish”), cuando una misma clase tenga diferentes nombres de espacio en diferentes funciones.

Nuevo en pybind11, espero que alguien pueda ayudar con preguntas.

Estoy envolviendo, en dos archivos hpp diferentes (p.hpp y s.hpp), dos clases que tienen un miembro de clase (mismo nombre, con diferentes espacios de nombres).

h.hpp:
void initP(py::module_ &m)
{
 using pn = a::b::p;
 py::class<pn> pnclass(m, "pn");
 pnclass.def("func1", &pn::func1);

py::class<ps> psclass(m, "ps");
 psclass.def_readonly("pn", &ps::pn);   //miembro pn (a::b::p), porque está dentro de initP(), ¿correcto?
}

s.hpp:

void initS(py::module_ &m)
{
  using pn = a::c::p;
  py::class<pn> pnclass(m, "pn");
  pnclass.def("func2", &pn::func2);

py::class<cs> psclass(m, "cs");
  psclass.def_readonly("ps", &cs::pn);   //miembro pn (a::c::p), ya que está dentro de initS(), ¿correcto?
}

En caso de utilizar los dos pn():

¿Ambos pn() serán expuestos, ¿correcto?
Entonces, significa que la persona que escribe el código en python, necesita saber cuál pnclass debe ser utilizado para llamar a func1 y func2, ¿correcto?

Revisé el documento de pybind11, pero no estoy seguro de dónde encontrar la información relevante.

Agradezco si alguien puede compartirlo.

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Basado en los fragmentos de código proporcionados, parece que hay dos clases diferentes con el mismo nombre “p” pero diferentes espacios de nombres “a::b” y “a::c”, y se están envolviendo por separado en dos archivos de encabezado diferentes “p.hpp” y “s.hpp”.

    En la función “initP” en “p.hpp”, se envuelve la clase “a::b::p” con un nombre de clase “pn” y se expone una función miembro “func1”. De manera similar, en la función “initS” en “s.hpp”, se envuelve la clase “a::c::p” con el mismo nombre de clase “pn” y se expone una función miembro “func2”.

    Parece que ambas clases y sus funciones miembro se expondrán a Python, pero debido a que tienen el mismo nombre, el usuario necesita diferenciar entre ellas al llamar a las funciones. Por ejemplo, pueden usar el nombre de la clase para llamar a la función deseada de la siguiente manera:

    import module_name
    
    # llamar a func1 desde a::b::p
    pb = module_name.pn()
    pb.func1()
    
    # llamar a func2 desde a::c::p
    pc = module_name.pn()
    pc.func2()
    

    En cuanto a dónde encontrar más información sobre esto, la documentación de pybind11 tiene una sección sobre “Conflictos de espacios de nombres” que puede ser útil: https://pybind11.readthedocs.io/en/stable/classes.html#conflicting-namespaces

Comments are closed.