EmbPythonSwigの標準的なグルーコードとは異なる処理をしたい場合,.iファイル内に独自のグルーコードの実装を記述して与えることができます.
クラスにない関数を新たに追加したりもできます.
// まずignoreすることでSWIGが標準のグルーコードを吐き出すのを抑制します. %ignore Nantoka::Hogeshi; // 次に独自実装のグルーコードを定義します. %extend Nantoka{ PyObject* Hogeshi(){ // この中にグルーコードの独自実装を書く. // selfのC++オブジェクトは $self で取得できる.
// 例 : PyObject* result; result = $self->HogeshiFunc(); // C++のNantokaオブジェクトのHogeshiFunc関数が呼ばれる return result; } } %enddef
上記の記述で,以下のような関数が生成されます.
PyObject* __PYDECL EPNantoka_GetContacts( 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; }