カスタムシーケンスタイプがあります。これは基本的にリストのラッパーとブールフラグであり、通常の不変のシーケンス動作をエミュレートしたかったのです。
私の問題はスライスです。Python 3でそれを実装する方法は、が単一のインデックスである__getitem__(key)
場合はアイテムを返し、がスライスオブジェクトである場合はスライスされたシーケンスを返すメソッドを持つことであることを理解しています。しかし、これらのケースをどのように区別する必要がありますか?%key
%key
基本的に2つの仮説があります。
sliced_list = self.wrapped_list[key]
if isinstance(key, slice):
return MyCustomSequenceType(sliced_list, boolean_flag)
return sliced_list
でもこれは悪ですね。または
sliced_list = self.wrapped_list[key]
try:
return MyCustomSequenceType(sliced_list, boolean_flag)
except TypeError:
return sliced_list
後者はよりパイソンに見えます。MyCustomSequenceType.__init__(self, datas, flag)
len(datas)を呼び出すという事実に依存しているので、がであるTypeError
場合%datas
は発生しinteger
ます。しかし、その後、別のランダムな問題__init__
を提起した場合、それは追跡できなくなります。TypeError
また、 http: //wiki.cython.org/enhancements/numpy/getitemisinstance
は、より高速な(実際にはより簡単に最適化できる)ヒントを示しています。
では、どうすればいいですか?