2010-10-15 9 views
8

Tengo un montón de clases y API escritas en C++ y Python expuestos a la ayuda de Boost.PythonPython en C++ utilizando la función de conversión Boost.Python

Actualmente estoy investigando las posibilidades de crear la siguiente arquitectura.
en Python:

from boostPythonModule import * 
AddFunction(boostPythonObject.Method1, args) 
AddFunction(boostPythonObject.Method2, args) 
AddFunction(boostPythonObject.Method2, args) 
RunAll() # running is done by C++ 

En C++:

void AddFunction(boost::object method, boost::object args) 
{ 
    /// 1. Here i need to extract a real pointer to a function 
    /// 2. Make argument and type checking for a function under method 
    /// 3. Unpack all arguments to native types 
    /// 4. Store the pointer to a function somewhere in local storage 
} 

void RunAll() 
{ 
    /// 1. run all previously stored functions and arguments for them 
} 

Básicamente estoy tratando de poner todas las funciones hasta la parte natural de mi programa. La cuestión es que no estoy seguro si es posible extraer todos los datos requeridos de Boost metainfo para hacer esto de manera genérica: en el momento de la compilación no debería saber qué funciones voy a llamar y qué argumentos aceptan.

Algunas preguntas:
1. ¿Hay alguna tabla compartida de información de Python a la que pueda acceder para verificar algunas de estas cosas?
2. Boost.Python no escribe comprobación de argumentos. ¿Se puede reutilizar por separado?

Déjame saber tus pensamientos.

Gracias

+0

¿Realmente necesita verificar todos los tipos en 'AddFunction()'? ¿No sería suficiente almacenar el método y los argumentos en algún lugar y llamar a esos métodos en 'RunAll()' De esa forma obtendría cualquier tipo de error relacionado que encuentre cuando ejecute los métodos y Boost.Python lo haría por usted . – Arlaharen

+0

Bueno, no. Básicamente, la idea es minimizar el intervalo de tiempo entre esas llamadas a funciones, por lo tanto, todos los argumentos deben verificarse antes. RuAll solo debe conocer los punteros de función C++ (es decir, functors), ¿Algún otro consejo? – Alex

+1

En ese caso no tengo ninguno. :-) No creo que este sea un caso de uso para el que se diseñó Boost.Python y que tendrá dificultades para doblarlo y hacer lo que quiera. ¿Es el tiempo pasado en Python entre las llamadas a sus métodos realmente tan significativo que tiene que hacer esto? Pero supongo que has hecho tu perfil ... :-) – Arlaharen

Respuesta

1

Me gustaría pensar acerca de las funciones de almacenamiento en caché y sus argumentos sobre el nivel del pitón - guardar los argumentos que utilizan la última forma de Keyword arguments sección del tutorial y llamar a sus funciones de C++ tarde unpacking saved arguments desembalaje realizan a nivel pitón aislará que desde cualquier tipo de impulso complicaciones de seguridad (todas las comprobaciones de tipos se realizarán en la etapa RunAll, haciéndolo más lento y menos seguro).

El enfoque optimizado para la velocidad sería implementar una clase de C++ con una interfaz común que pueda aceptar llamadas de funciones que admitan argumentos dados y almacenar en caché sus valores internamente para utilizarlas en ejecuciones posteriores.

struct Runner { 
    virtual int run() = 0; 
}; 

struct ConcreteRunner: public Runner { 
    std::string _arg; 
    void setArguments(std::string arg) {_arg=arg;} 
    virtual int run() {clog << "ConcreteRunner is called with argument" << _arg << endl;} 
}; 

Este enfoque maneja el análisis de argumentos fuera de la sección RunAll por lo tanto lo hace lo más rápido posible.

Cuestiones relacionadas