[[devel]] [[開発ノウハウ集]] EmbPythonSwigの標準的なグルーコードとは異なる処理をしたい場合,.iファイル内に独自のグルーコードの実装を記述して与えることができます. クラスにない関数を新たに追加したりもできます. - 使用例 -- コールバック関数(PyObject*)を引数に取り,コールバック登録を行う関数を作りたい場合. -- GetHogeshi(int i)とNHogeshis()から,リスト化して返すGetHogeshis()を自動生成するなど. --- src/EmbPython/Utility/EPObject.i の EXTEND_N_GETS_TO_LIST で使われていますので参照してください. ** NantokaクラスのHogeshiメソッドの実装を与える例 [#gc7a82a7] // まずignoreすることでSWIGが標準のグルーコードを吐き出すのを抑制します. %ignore Nantoka::Hogeshi; // 次に独自実装のグルーコードを定義します. %extend Nantoka{ PyObject* Hogeshi(){ // この中にグルーコードの独自実装を書く. // selfのC++オブジェクトは $self で取得できる. // 例 : PyObject* result; result = $self->HogeshiFunc(); // C++のNantokaオブジェクトのHogeshiFunc関数が呼ばれる return result; } } %enddef ~ 上記の記述で,以下のような関数が生成されます. - 前処理や後処理が多数追加されること - $selfが Nantoka* c_self に置き換わること - return が ret_tmp= に置き換わること に注意してください. PyObject* __PYDECL EPNantoka_Hogeshi( PyObject* self ) { UTAutoLock LOCK(EPCriticalSection); if( EPObject_Ptr(self) == NULL ) { PyErr_SetString( PyErr_Spr_NullReference , "Null Reference in Nantoka.GetContacts"); return NULL; } if(true) { PyObject* ret_tmp; { PyObject * py_self = self; Nantoka* c_self = EPObject_Cast(py_self,Nantoka); // この中にグルーコードの独自実装を書く. // selfのC++オブジェクトは $self で取得できる. // 例 : PyObject* result; result = c_self->HogeshiFunc(); // C++のNantokaオブジェクトのHogeshiFunc関数が呼ばれる ret_tmp = result; } PyObject* c_ret = ret_tmp; PyObject* py_ret = c_ret; if ( !py_ret ) { PyErr_BadInternalCall(); return NULL; } if ( py_ret == Py_None ) Py_RETURN_NONE; return py_ret; } PyErr_BadArgument(); return NULL; } * グルーコードヘッダにそのまま出力されるコードを書く [#e2f9ea9a] .iファイルで %begin%{ // ... } で囲んだ部分は,グルーコードヘッダにそのまま出力されます.