SWIG эквивалент хранения boost :: python :: object - PullRequest
1 голос
/ 02 апреля 2012

Что такое SWIG, эквивалентный хранению копии произвольного объекта python?

Я почти уверен, что то, что я спрашиваю, возможно, потому что это будет работать с boost :: python (см. Ниже), но я не вижу способа сделать это с помощью SWIG.

#include <boost/python.hpp>

using namespace boost::python;

class MyClass
{
public:
    // other operations
    object get_info() { return info_; }
    void set_info(object info) { info_ = info; }

private:
    object info_;
};

BOOST_PYTHON_MODULE( mymodule )
{
    class_<MyClass>("MyClass")
        .def("get_info", &MyClass::get_info )
        .def("set_info", &MyClass::set_info )
    ;
}

1 Ответ

1 голос
/ 02 апреля 2012

Простейший пример:

%module test

%inline %{
class MyClass
{
public:
    // other operations
    PyObject *get_info() { return info_; }
    void set_info(PyObject *info) { info_ = info; }

private:
    PyObject *info_;
};
%}

например:

swig -python -Wall -c++ test.i
g++ -Wall -Wextra test_wrap.cxx -I/usr/include/python2.6 -o _test.so -shared
python
Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> foo = test.MyClass()
>>> str = "hi"
>>> foo.set_info(str)
>>> print foo.get_info()
hi
>>>

Но учтите, что в этом случае право собственности на объект не изменилось.Если бы я сделал foo.set_info("hi") вместо этого, он был бы освобожден, потому что к тому времени, когда он вызвал foo.get_info().

, ссылки не были сохранены. Это можно исправить, добавив вызов:

Py_INCREF(info);

внутри set_info(), но тогда вам потребуется соответствующий DECREF в деструкторе, или, если set_info() вызывается, когда ссылка уже удерживается, или для создания или присвоения копии.(Или какой-нибудь хороший тип RAII, чтобы сделать все это для вас ...)

...