Я написал Python Wrapper для библиотеки C ++ 14, используя SWIG.В C ++ API я могу зарегистрировать std :: functions как обратные вызовы.
У меня есть SWIG карта типов для std :: function для передачи лямбда-выражения, которое вызывает обратный вызов Python:
%typemap(in) std::function {
auto callback = [$input](auto&&... params) {
PyGILState_STATE state = PyGILState_Ensure();
PyObject* result = PyObject_CallFunctionObjArgs($input,makePyObject(std::forward<decltype(params)>(params))..., NULL);
const int retVal = PyObject_IsTrue(result);
Py_DECREF(result);
PyGILState_Release(state);
return retVal == 1;
};
$1 = std::move(callback);
}
Когда я запускаю тестовый скрипт, следующее выражение Python работает нормально:
callback = lambda a,b: self.doStuff(a,b)
self.cppInterface.registerFunc(callback)
Это выражение, однако, не работает:
self.cppInterface.registerFunc(lambda a,b: self.doStuff)
Когда я передаю лямбду непосредственно в функцию регистра,Я получаю следующую ошибку при вызове обратного вызова из C ++:
TypeError: 'managedbuffer' object is not callable
Почему вход PyObject $ не вызывается?Как разрешить оба выражения Python?
Пример кода:
https://github.com/nullmedium/python-swig-demo