2012-01-11 7 views
2

私はSWIGを使ってC拡張Pythonライブラリを生成しています。私は基本的に(概念的に)Pythonのリストデータ型にマップするシーケンス型のCデータ型を持っています。SWIGを使ったPython C拡張(%pythoncodeキーワードを使って魔法を追加)

SWIGを使用して拡張機能を生成しましたが、ライブラリを使用して記述されたコードがPythonになるようにSWIGインタフェースを改善したいと考えています。私のSWIGインタフェースファイルの関連セクションでここ

など __ __getitem ____のようないくつかのPythonの魔法の機能を追加するために

私は、私のインターフェイスファイルの%pythoncodeキーワードを使用しています:

%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に感謝します。エラーはあなたがsize()という名前の属性を定義していない示し

else: 
    datasize = self.size() 

+1

'_swig_getattr'で生成された' AttributeError'は、あなたがラップされていないメンバーにアクセスしようとしたか、名前にタイプミスがあることを示します。今のところあなたのコードのその部分を見ることができないので、それ以上のことは言えません。あなたは* minimal *しかし完全な例をおそらく作り出すことができますか?私。問題を示す最も短い.i、.h、.cファイルを生成できますか? – Flexo

答えて

1

エラーがであるように思われます。

__getitem__,__setitem__,__len__の機能をC++に実装し、Pythonに公開されることを考えましたか?この目的でSWIGの%extendディレクティブを使用することができます。

関連する問題