Я пытаюсь "pythonize" аргументы метода при вызове обратного вызова python:
%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
Например, я хочу, чтобы аргумент info
в python был tuple("iiso")
, а не объектом оболочки Swig.
Unfortunatley SWIG почему-то игнорирует мой typemap(out)
.Есть идеи?