2011-06-28 9 views
10

que tienen una función de Python con esta firma:¿Cómo pasas kwargs a una función envuelta boost-python?

def post_message(self, message, *args, **kwargs): 

quisiera llamar a la función de C++ y pasar a él algunos kwargs. Llamar a la función no es el problema. Saber cómo pasar los kwargs es. Aquí es un trabajador no muestra parafraseado:

std::string message("aMessage"); 
boost::python::list arguments; 
arguments.append("1"); 

boost::python::dict options; 
options["source"] = "cpp"; 

boost::python::object python_func = get_python_func_of_wrapped_object() 
python_func(message, arguments, options) 

Cuando hago ejercicio este código, en el APP recibo (que no es lo que me gustaría):

messsage = aMessage 
args = (['1'], {'source': 'cpp'}) 
kwargs = {} 

¿Cómo se pasa los opciones en mi ejemplo en el ** diccionario kwargs?

he visto uno post sugiere utilizar la sintaxis opciones ** (cómo fresco es esto!):

python_func(message, arguments, **options) 

Por desgracia, esto se traduce en

TypeError: No to_python (by-value) converter found for C++ type: class boost::python::detail::kwds_proxy 

Gracias por cualquier ayuda que puede dar.

Respuesta

13

Después de algunas investigaciones, resulta que el operador de llamada función de objeto se reemplaza por dos argumentos de tipo args_proxy y kwds_proxy. Entonces debes usar este estilo de llamada específico de dos argumentos.

args_proxy y kwds_proxy son generados por * las sobrecargas. Esto es realmente bueno.

Además, el primer argumento debe ser un tipo de tupla para que el intérprete de Python maneje correctamente el argumento * args.

El ejemplo que resulta funciona:

boost::python::list arguments; 
arguments.append("aMessage"); 
arguments.append("1"); 

boost::python::dict options; 
options["source"] = "cpp"; 

boost::python::object python_func = get_python_func_of_wrapped_object() 
python_func(*boost::python::tuple(arguments), **options) 

Espero que esto ayude ...

+2

Wow, no sabía nada de la * y ** sobrecargas, uno de esos pequeños detalles que hacen impulso :: Pitón admirable. – eudoxos

Cuestiones relacionadas