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.
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:
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