Как указать политику возврата для объекта, возвращаемого как часть кортежа в Boost Python - PullRequest
0 голосов
/ 31 января 2011

У меня есть функция, которая создает объект C ++. Перед рефакторингом я возвращал указатель из функции C ++, и в обёртке python boost объявление я бы использовал boost::python::return_value_policy<boost::python::manage_new_object>. Примерно так:

MyObject* create_object_from_description(std::string& description) 
{
    ...
    return myObject;
}
BOOST_PYTHON_MODULE(pymol) {
    boost::python::def("create_obj_from_desc", create_object_from_description,
        (boost::python::arg("description")),
        "",
        boost::python::return_value_policy<boost::python::manage_new_object>()
);

Теперь мне нужно вернуть больше, чем просто объект, но также и некоторые сообщения об ошибках, и рефактор в основном меняет функцию C ++, чтобы она возвращала кортеж:

boost::python::tuple create_object_from_description(std::string& description) 
{
    ...
    return boost::python::make_tuple(myObject, errmsg);
}

Как мне указать политику возврата с этим изменением?

1 Ответ

1 голос
/ 01 февраля 2011

Я не думаю, что это возможно.Что вам, вероятно, нужно сделать, это изменить сигнатуру функции и переупорядочить функцию в python.Вот так:

boost::python::tuple create_object_from_description(std::string& description, 
                                                    MyObject& myObject) 
{
    myObject = mo; 
    return errmsg 
}

Тогда в python есть такая функция:

def create_object_from_description(description):
    mo = MyObject()
    errmsg = pymol.create_object_from_description(description, mo)
    return mo, errmsg

Конечно, вы должны ДЕЙСТВИТЕЛЬНО сделать исключение.Boost :: python отлично справляется с преобразованием исключений c ++ в исключение python и наоборот

...