boost/python/scope.hpp

はじめに

Python のスコープ(名前空間)を問い合わせたり制御する機能を定義する。このスコープには新しくラップするクラスや関数を追加できる。

クラス

scope クラス

class scope : public object

scope クラスは、新しい拡張クラスおよびラップした関数がその属性として定義される Python の名前空間を制御する(自分自身に対応した)グローバルな Python オブジェクトを持つ。新しい scope オブジェクトをデフォルトコンストラクタで構築すると、そのオブジェクトは対応するグローバルな Python のオブジェクトに束縛される。scope オブジェクトを引数付きで構築すると、対応するグローバルな Python のオブジェクトを引数が保持するオブジェクトへ変更する。これはこの scope オブジェクトの寿命が終わるまで続き、その時点で対応するグローバルな Python オブジェクトは scope オブジェクトを構築する前の状態に復元する。

scope クラスの概要

namespace boost { namespace python
{
  class scope : public object
  {
   public:
      scope(scope const&);
      scope(object const&);
      scope();
      ~scope()
   private:
      void operator=(scope const&);
  };
}}

scope クラスのコンストラクタおよびデストラクタ

explicit scope(scope const &x)
explicit scope(object const &x)

現在のスコープ相当オブジェクトへの参照を格納し、スコープ相当オブジェクトに x.ptr() が参照するオブジェクトを設定する。object 基底クラスを x で初期化する。

scope()

現在のスコープ相当オブジェクトへの参照を格納する。object 基底クラスを現在のスコープ相当オブジェクトで初期化する。モジュール初期化関数の外部では、現在の相当 Python オブジェクトは None である。

~scope()

現在の相当 Python オブジェクトを格納したオブジェクトに設定する。

以下の例は、スコープの設定を使用して入れ子クラスを定義する方法を示している。

C++ のモジュール定義
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/scope.hpp>
using namespace boost::python;

struct X
{
  void f() {}

  struct Y { int g() { return 42; } };
};

BOOST_PYTHON_MODULE(nested)
{
   // 現在の(モジュールの)スコープにいくつか定数を追加する
   scope().attr("yes") = 1;
   scope().attr("no") = 0;

   // 現在のスコープを変更する
   scope outer
       = class_<X>("X")
            .def("f", &X::f)
            ;

   // 現在のスコープ X でクラス Y を定義する
   class_<X::Y>("Y")
      .def("g", &X::Y::g)
      ;
}
Python の対話例
>>> import nested
>>> nested.yes
1
>>> y = nested.X.Y()
>>> y.g()
42