使用SWIG包装具有虚拟方法的C++类并在Python中重写它们
我正在尝试在调用 Python 回调时“pythonize”方法参数:
%module (directors="1") py_test %feature("director") mgr; struct hdr_val { const char *hdr; const char *val; }; struct hdr_list { int count; struct hdr_val *elems; }; struct myinfo { int newcid; int oldcid; const char *uri; struct hdr_list hlist; }; %{ PyObject* make_hdrlist(const struct hdr_list *hl) { PyObject* result; result = PyList_New(hl->count); for(int i = 0; i count; i++) PyList_SetItem(result, i, Py_BuildValue("(ss)", hl->elems[i].hdr, hl->elems[i].val)); return result; } %} class mgr { public: mgr() { } virtual void doit(); virtual void done(const struct myinfo* i) // Will be redefined in python { } }; %typemap(out) struct myinfo* i { $result = Py_BuildValue("(iiso)", $1->newcid, $1->oldcid, $1->uri, make_hdrlist(&$1->hlist)); }
这样在 Python 中我就可以做到以下几点:
import py_test class pymgr(py_test.mgr): def done(self, info): oldcid,newcid,uri,hlist = info
举个例子,我希望在 Python 中的 info
参数是一个 tuple("iiso")
,而不是 Swig 包装对象。
不幸的是,SWIG 出于某种原因忽略了我的 typemap(out)
设置。有什么想法吗?
1 个回答
1
好的,我找到了答案。typemap应该放在class mgr之前。
%typemap(directorin) myinfo const * {
$input = Py_BuildValue("(iiso)", $1_name->newcid, $1_name->oldcid,
$1_name->uri, make_hdrlist(&$1_name->hlist));
}