2
我正在使用SWIG生成C扩展Python库。我有一个C数据类型,它本质上是一个序列类型,它在概念上映射到Python中的列表数据类型。使用SWIG的Python C扩展(使用%pythoncode关键字添加魔术方法)
我已经使用SWIG生成了扩展,但现在想要改进SWIG接口,以便使用库编写的代码更加Python化。
我用我的接口文件中的%Python代码的关键字,以添加像__ 的GetItem __等
这是我痛饮接口文件的相关章节一些Python神奇功能:
%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
我该如何解决这个问题?那些锐利的眼睛也会发现我目前的迭代实现不起作用。我会感谢指针/帮助geting,以及工作。
'_swig_getattr'中引发的'AttributeError'表明您试图访问未包装或名称中有拼写错误的成员。由于目前我们无法在问题中看到代码中的部分内容,因此无法多说。你能产生一个*最小*但可能是完整的例子吗?即您可以生成的最短的.i,.h和.c文件显示问题? – Flexo 2012-01-12 11:47:00