5

私は非常に単純であるべきことをしようとしていますが、既存のドキュメントからその方法を理解するのはあまりうまくいきません。

Python 2 プロジェクトの場合、リストの gettext-translated 文字列を Unicode インスタンスとして Python に返そうとしています。gettext() の戻り値は UTF-8 でエンコードされた char* であり、PyUnicode_FromString を使用して Python Unicode インスタンスに変換するのは非常に簡単です。これは簡単なことだと思いますが、方法がわかりません。

Ignacio Vazquez-Abrams と Thomas KI からのコメントに基づいて、単一の文字列に対してこれを機能させました。その場合、すべての boost.python インフラストラクチャをバイパスできます。次に例を示します。

        PyObject* PyMyFunc() {
            const char* txt =  BaseClass::MyFunc();
            return PyUnicode_FromString(txt); 
    }       

これは、通常の def ステートメントで公開されます。

class_<MyCclass>("MyClass")
    .def("MyFunc", &MyClass::PyMyFunc);

残念ながら、Unicode インスタンスのリストを返したい場合、これは機能しません。これは私の素朴な実装です:

boost::python::list PyMyFunc() {
    std::vector<std::string> raw_strings = BaseClass::MyFunc();
    std::vector<std::string>::const_iterator i;
    boost::python::list result;

    for (i=raw_strings.begin(); i!=raw_strings.end(); i++)
        result.append(PyUnicode_FromString(i->c_str()));
    return result;
}

しかし、これはコンパイルされません: boost::python::list は PyObject 値を処理しているようです。

4

1 に答える 1

2

C++-SIG メーリングリストの助けを借りて、これが機能するようになりました。2 つの追加の手順が必要です。

  1. boost::python::handle<> を使用して、参照処理を処理する PyObject* の周りに C++ ラッパーを作成します。
  2. boost::python::object を使用して、ハンドルの周りに C++ ラッパーを作成します。これにより、PyObject* インスタンスを (合理的に) 通常の C++ クラス インスタンスとして使用できるようになり、boost::python::list が処理できるものになります。

その知識があれば、作業コードは次のようになります。

boost::python::list PyMyFunc() {
    std::vector<std::string> raw_strings = BaseClass::MyFunc();
    std::vector<std::string>::const_iterator i;
    boost::python::list result;

    for (i=raw_strings.begin(); i!=raw_strings.end(); i++)
        result.append(
             boost::python::object(
               boost::python::handle<>(
                 PyUnicode_FromString(i->c_str()))));
    return result;
}
于 2011-02-22T10:06:02.913 に答える