1

列インデックスに基づいて行から列値を返すコードを書いています。行は C++ で時々更新されます。Python コードで列の値への参照を保持したいと思います。次のコードは、列の値を繰り返し取得する必要がある現在のソリューションを反映しています。

struct Foo
{
   PyObject * get(int pos)
   {
       // Position 0 is an integer value.  Position 1 is a float value
       if (pos == 0)
           return Py_BuildValue ("i", m_int);
       else
           return Py_BuildValue ("f", m_float);
   }
   void set_int(int i)
   {
       m_int = i;
   }
   void set_float(float f)
   {
       m_float = f;
   }
   int m_int;
   float m_float;
};

私のバインディングはシンプルです:

class_<Foo> ("Foo")
        .def("get", &Foo::get)
        .def("set_int", &Foo::set_int)
        .def("set_float", &Foo::set_float)
        ;

これは、次のように Python レベルで機能します。

In [16]: foo = Foo()
In [17]: foo.set_int(1)
In [18]: foo.set_float(2.5)
In [19]: i = foo.get(0)
In [20]: f = foo.get(1)
In [21]: i
Out[21]: 1

In [22]: type(i)
Out[22]: int

In [23]: f
Out[23]: 2.5

In [24]: type(f)
Out[24]: float

ここまでは順調ですね。ただし、foo を変更するときは、i と f に新しい値を反映させたいと思います。現在、それらは古い値を反映しています。

In [25]: foo.set_int(42)
In [26]: i
Out[26]: 1

「get」が Foo メンバー変数のコピーではなくへの参照を返すように、C++ とバインディング コードをセットアップするにはどうすればよいですか?

4

1 に答える 1