Crear instancia de una clase Python, declaró en pitón, con la API C
-
18-09-2019 - |
Pregunta
Quiero crear una instancia de una clase Python definido en el alcance __main__
con la API C.
Por ejemplo, la clase se llama MyClass
y se define como sigue:
class MyClass:
def __init__(self):
pass
El tipo de clase vive bajo alcance __main__
.
Dentro de la aplicación C, quiero crear una instancia de esta clase. Esto podría haber sido simplemente posible con PyInstance_New
ya que toma nombre de la clase. Sin embargo, esta función no está disponible en python3.
Cualquier ayuda o sugerencias de alternativas son apreciados.
Gracias, Paul
Solución
Creo que el enfoque más simple es:
/* get sys.modules dict */
PyObject* sys_mod_dict = PyImport_GetModuleDict();
/* get the __main__ module object */
PyObject* main_mod = PyMapping_GetItemString(sys_mod_dict, "__main__");
/* call the class inside the __main__ module */
PyObject* instance = PyObject_CallMethod(main_mod, "MyClass", "");
además de la comprobación de errores por supuesto. Sólo necesita instance
DECREF cuando haya terminado con él, los otros dos son referencias prestado.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow