2012-08-23 23 views
8

BitArrayクラスを記述しようとしていますが、numpyの配列x[i:j:k] = valのようなものを持つのは面白いでしょう。Pythonの拡張スライス?

これをPythonでどのように書きますか? __setslice__ではなく、そうですか?それは3つの引数しか取らないので、4つを取るためには1つの引数が必要です。

+0

:ここ

は、その形態を参照して、key引数を出力する例ですか? – cyroxx

答えて

5

__setslice__は推奨されていません。__setitem__にslice引数を使用します。

Python documentationごとに、スライスは、a[i:j:step],a[i:j, k:l]、またはa[..., i:j]の構文形式でのみ実行できることに注意してください。コロンベースの構文は、単一のスライスオブジェクトを定義するために使用されますが、2番目の例で示すように、複数のスライス引数を持つことができます(スライスのタプルとして渡されます)。あなたは合格するかどう四つの引数

>>> class Foo(object): 
>>>  def __setitem__(self, key, value): 
>>>   print key 
>>> 
>>> a = Foo() 
>>> a[1:1] = 1 
slice(1, 1, None) 
>>> 
>>> a[1:1:1] = 1 
slice(1, 1, 1) 
>>> 
>>> a[1:1, 1:1] = 1 
(slice(1, 1, None), slice(1, 1, None)) 
+1

http://docs.python.org/release/2.3.5/whatsnew/section-slices.htmlの下にサンプルコードがありますが、実際にはこれらの目的にはまだ役立ちます。スライスオブジェクトの完全に一般的な 'setitem'を実装することがかなり難しい場合は、スライスオブジェクトの他には文書化されていない' indices'メソッドを文書化します。 –

1

__setslice__は廃止され、Python 3 changelogを参照してください。

__getslice__()__setslice__()__delslice__()が殺されました。 a[i:j]の構文は、a.__getitem__(slice(i, j))(またはそれぞれ割り当てまたは削除ターゲットとして使用される場合は__setitem__()または__delitem__())に変換されます。

同様に、あなたはa[i:j:k]a.__getitem__(slice(i, j, k))に変換構文を意味slice()にステップ値を渡すことができます。

関連する問題