Объекты C ++, которые переносят пользовательские данные Python в SWIG - PullRequest
2 голосов
/ 05 апреля 2011

Есть ли способ для объектов C ++, обернутых SWIG, переносить с собой пользовательские данные Python при их передаче между C ++ и Python и обратно?Пример:

example.h

class MyClass
{
public:
    int foo;
};

// Black box functions.
// Only thing guaranteed is that the last object handed to consume
// will be returned by eject.
void consume(MyClass *obj);
MyClass *eject();

example.i

%module Example

%{
        #include "example.h"
%}

%include "example.h"

test.py

import Example

a = Example.MyClass()
a.bar = "Puppies"

Example.consume(a)
b = Example.eject()

## Should output "Puppies"
print b.bar

Текущий вывод - это «AttributeError: bar».

Есть ли какой-либо способ получить такую ​​функциональность?Если бы функции SWIG's_ getattr _ для MyClass можно было настраивать, возможно, неизвестные атрибуты можно было бы сохранить и загрузить из внутреннего PyObject * (либо с помощью автоматического подкласса SWIG MyClass, либо с помощью такого объектауже присутствует в MyClass)?

Спасибо!

1 Ответ

0 голосов
/ 05 апреля 2011

Это единственное (частичное) решение, которое я придумала до сих пор:

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) Деструктор класса должен также знать о данных и очищать их. Опять же, хорошо для моих текущих потребностей, но несколько громоздко.

...