devel

EmbPythonSwigの標準的なグルーコードとは異なる処理をしたい場合,.iファイル内に独自のグルーコードの実装を記述して与えることができます.

クラスにない関数を新たに追加したりもできます.

  • 使用例
    • コールバック関数(PyObject*)を引数に取り,コールバック登録を行う関数を作りたい場合.
    • GetHogeshi(int i)とNHogeshis()から,リスト化して返すGetHogeshis()を自動生成するなど.
      • src/EmbPython/Utility/EPObject.i の EXTEND_N_GETS_TO_LIST で使われていますので参照してください.

NantokaクラスのHogeshiメソッドの実装を与える例

// まず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_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;
}