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