Swig Python карта типов для входа и выхода - PullRequest
0 голосов
/ 17 января 2020

Допустим, у меня есть пользовательский объект MyNamespace::MyProject::MyObj и функция, которая возвращает один из них, например ...

bool myfunc(int a, MyNamespace::MyProject::MyObj &b);

Я обнаружил, что могу создать карту типов, которая будет b возвращаемое значение с левой стороны в Python, поместив это в мой файл .i ...

%typemap(in,numinputs=0) ML::Processing::MyObj& {
    // Create a persistent object to hold the result;
    $1 = new ML::Processing::MyObj;
}
%typemap(argout) ML::Processing::MyObj& (PyObject* tmp) {
    // Store the persistent object in a PyObject* that will be destroyed
    // when it goes out of scope.
    tmp = SWIG_NewPointerObj($1, $1_descriptor, SWIG_POINTER_OWN);
    $result = SWIG_Python_AppendOutput($result, tmp);
}

Таким образом, в Python я могу сделать следующее ...

ok,b = mylib.myfunc(1)

Пока что все просто. Но теперь давайте предположим, что у меня есть другая функция, которая похожа, но принимает MyObj в качестве ввода, например ...

bool myfunc2(int a, const MyNamespace::MyProject::MyObj &b)

Когда я пытаюсь вызвать это в Python (как показано ниже) Я получаю Wrong number or type of arguments ошибку

ok,b = mylib.myfunc(1) # this works correctly
ok = mylib.myfunc2(1,b) # this complains

Я думаю, что это как-то связано с typemap(in,numinputs=0) в файле .i ... как каждый раз, когда он видит MyNamespace::MyProject::MyObj &, он теперь думает, что это возвращаемый аргумент вместо ввода.

Итак, мой вопрос, есть ли способ справиться с такой ситуацией, чтобы у меня могли быть как входная карта типов, так и выходная карта типов? Заранее благодарим всех вас, мастера swig-fu!

...