Это единственное (частичное) решение, которое я придумала до сих пор:
class MyClass
{
...
MyClass() : data(NULL) {}
~MyClass() {if(data) Py_DECREF(data);}
PyObject *data;
};
%typemap(in) PyObject* data {
if(arg1 && arg1->data != NULL)
Py_DECREF(arg1->data);
$1 = $input;
Py_XINCREF($1);
}
%typemap(out) PyObject* data {
$result = $1;
}
Проблемы
1) SWIG устанавливает $1
в NULL
вместо существующего значения, и я не смог найти официальный способ доступа к существующему значению внутри карты типов. Вышеуказанное зависит от того, как SWIG называет объект (MyClass *) как arg1. Работает, но, вероятно, не переносится в будущих версиях SWIG.
2) Код Python должен быть a.data.bar = "Puppies"
. Это нормально, но не идеально.
3) Требуется, чтобы в классе был data
член. Это нормально для моих текущих потребностей и может быть обработано базовым классом.
4) Деструктор класса должен также знать о данных и очищать их. Опять же, хорошо для моих текущих потребностей, но несколько громоздко.