Расширение Python C с использованием SWIG (добавление магических методов с использованием ключевого слова% pythoncode) - PullRequest
3 голосов
/ 11 января 2012

Я использую SWIG для создания библиотеки Python с расширением C.У меня есть тип данных C, который по сути является типом последовательности, который (концептуально) отображается на тип данных списка в Python.

Я сгенерировал расширение с помощью SWIG, но теперь хочу улучшить интерфейс SWIG, чтобы коднаписано с использованием библиотеки, более Pythonic.

Я использую ключевое слово% pythoncode в моем файле интерфейса, чтобы добавить некоторые магические функции Python, такие как __ getitem __ и т.д.

Вот соответствующий раздел моего файла интерфейса SWIG:

%pythoncode %{
    def __getitem__(self, key):
        if not isinstance(key, int ):
            raise TypeError('Index value must be integer')
        else:
            datasize = self.size()
            if (key > -1) and (key < datasize):
                return self.getItem(key)
            else:
                raise IndexError('Index out of array bounds')

    def __setitem__(self, key, value):
        if not isinstance(key, int ):
            raise TypeError('Index value must be integer')
        else:
            if not isinstance(value, double) and not isinstance(value, int):
                raise TypeError('Value must be a number')
            else:
                datasize = self.size()
                if (key > -1) and (key < datasize):
                    return self.setItem(key, value)
                else:
                    raise IndexError('Index out of array bounds')


    def __iter__(self):
        return self

    def next(iterator):
        raise StopIteration()
%}

Я компилирую и успешно импортирую библиотеку на Python.

import mylib
temp = mylib.MySequenceDataType(10)
temp[0] = 42

Однако, когда я пытаюсь присвоить значение моему типу данных последовательности, как показано выше, я получаю следующую ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "myextlib.py", line 195, in __getitem__
    datasize = self.size()
  File "myextlib.py", line 151, in <lambda>
    __getattr__ = lambda self, name: _swig_getattr(self, MySequenceDataType, name)
  File "myextlib.py", line 55, in _swig_getattr
    raise AttributeError(name)
AttributeError: size

Как это исправить ?.Те, кто проницателен, также заметят, что мои текущие реализации для итераций не работают.Я был бы признателен за указатели / помощь, чтобы заставить это работать.

1 Ответ

1 голос
/ 09 июля 2012

Ошибка, кажется, в:

else:
   datasize = self.size()

Ошибка указывает, что вы не определили атрибут с именем size().

Рассматривали ли вы реализацию функций __getitem__, __setitem__, __len__ в C ++, а затем позволить им получить доступ к Python?Для этой цели вы можете использовать директиву %extend в SWIG.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...