2012-01-11 31 views
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,以及工作。

+1

'_swig_getattr'中引发的'AttributeError'表明您试图访问未包装或名称中有拼写错误的成员。由于目前我们无法在问题中看到代码中的部分内容,因此无法多说。你能产生一个*最小*但可能是完整的例子吗?即您可以生成的最短的.i,.h和.c文件显示问题? – Flexo 2012-01-12 11:47:00

回答

1

的错误似乎是:

else: 
    datasize = self.size() 

的错误表明您还没有定义命名size()的属性。

您是否考虑过在C++中实现函数__getitem__,__setitem____len__然后让它们暴露给Python?为此,您可以在SWIG中使用%extend指令。