1

ネストされたenum's' を持ついくつかの C++ クラスを Python に公開しています。boost.orgおよびwiki.python.orgのドキュメントの例を見ると、グローバル/モジュール スコープに戻るために、いったんスコープに入った後にスコープを離れる方法がわかりません。代わりに、後続の各スコープは前のスコープ内にネストされます。

例として:

#include <boost/python.hpp>

class Foo
{
public:
    enum Choose { eFoo, eBar };

    /* Default constructor with enum as required argument */
    Foo(Choose choice): m_choice(choice) {}
    ~Foo() {}

    Choose get() const { return m_choice; }

private:
    const Choose m_choice;

};


class Bar
{
};

BOOST_PYTHON_MODULE(foo)
{
    using namespace boost::python;
    scope global;

    /* Define Foo class, and a scope to go with it. */
    scope in_Foo = class_<Foo>
        ("Foo", init<Foo::Choose>())
        .def("rovalue", &Foo::get)
        ;

    /* Expose 'Choose' enum as Foo.Choose */
    enum_<Foo::Choose>("Choose")
        .value("Foo", Foo::eFoo)
        .value("Bar", Foo::eBar)
        ;

    /* How to get back to module scope??  */
    global;
    scope();

    /* This currently is exposed as Foo.Bar, but should just be Bar */
    class_<Bar>("Bar", init<>())
        ;
}

その行をさまざまなものに変更しようとしましglobal;たが、すべて同じ結果になりました。

$ g++ -fPIC -shared scope.cpp -o foo.so -lpython2.7 -I/usr/include/python2.7 -lboost_python
$ python -c 'import foo; print "Bar" in dir(foo)'
False
$ python -c 'import foo; print "Bar" in dir(foo.Foo)'
True

編集:

wiki.python.org をもう一度見てみると、上記の例ではscope within(global)、モジュール レベルのスコープに戻すために を使用するのが正しい答えのようです。実際、これは上記の例で機能します。残念ながら、実際のアプリケーションで使用するとコンパイル エラーが発生します。

#include <boost/python.hpp>
using namespace boost;
BOOST_PYTHON_MODULE(foo)
{
    python::scope module_level;
    /* .... */
    python::scope python::within(module_level);
    /* ... */
}

コンパイル エラー:

error: invalid use of qualified-name 'boost::python::within'
4

1 に答える 1