Как я могу указать значение именованного аргумента в boost.python? - PullRequest
6 голосов
/ 07 июля 2011

Я хочу встроить функцию, написанную на Python, в код C ++.Мой код на Python: test.py

def func(x=None, y=None, z=None):  
  print x,y,z  

Мой код c ++:

module = import("test");  
namespace = module.attr("__dict__");  

//then i want to know how to pass value 'y' only.  
module.attr("func")("y=1") // is that right?

Ответы [ 2 ]

1 голос
/ 29 августа 2013

Я не уверен, что Boost.Python реализует оператор разыменования **, как заявлено, но вы все равно можете использовать Python C-API для выполнения метода, в который вы ввели, , как описано здесь .

Вот прототип решения:

//I'm starting from where you should change
boost::python::object callable = module.attr("func");

//Build your keyword argument dictionary using boost.python
boost::python::dict kw;
kw["x"] = 1;
kw["y"] = 3.14;
kw["z"] = "hello, world!";

//Note: This will return a **new** reference
PyObject* c_retval = PyObject_Call(callable.ptr(), NULL, kw.ptr());

//Converts a new (C) reference to a formal boost::python::object
boost::python::object retval(boost::python::handle<>(c_retval));

После того, как вы преобразовали возвращаемое значение из PyObject_Call в формальное boost::python::object, вы можете либо вернуть его из своей функции, либо просто забыть, и новая ссылка, возвращаемая PyObject_Call, будет автоматически удалена.

Для получения дополнительной информации о переносе PyObject* в boost::python::object ознакомьтесь с руководством Boost.Python. Точнее, по этой ссылке, конец страницы .

0 голосов
/ 08 июля 2011

теоретический ответ (нет времени, чтобы попробовать себя: - |):

boost::python::dict kw;
kw["y"]=1;
module.attr("func")(**kw); 
...