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