列インデックスに基づいて行から列値を返すコードを書いています。行は 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++ とバインディング コードをセットアップするにはどうすればよいですか?