0

C++オブジェクトを作成する関数があります。リファクタリングの前は、C ++関数からポインターを返していましたが、boost pythonラッパー宣言では、を使用してい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);
}

この変更で返品ポリシーをどのように指定する必要がありますか?

4

1 に答える 1

1

これが可能だとは思いません。おそらくあなたがする必要があるのは、関数の署名を変更し、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 の例外に、またはその逆に変換するという非常に優れた仕事をします。

于 2011-02-01T17:04:04.507 に答える