Pythonのリストを範囲指定して操作するとき
int_list[10:2]
みたいに表記すると実際に__get__
メソッドに渡されるsliceオブジェクトですが、自前でリスト的クラスを実装しようとするときにslice引数に対応しようとするとはたと困ります。sliceをインデックス番号の列に変換するメソッドがないぞと。
自力でそういう変換処理を書こうとすると大変ですね、stepが負の数・Noneの場合、startやstopが負の数・Noneの場合、これは条件分岐の嵐で死ねます。
しかしそういう面倒な処理をやってくれるメソッドが目立たないながら存在します。slice.indices()
です。リストの長さを与えるとそれに合わせて負の数・Noneをちゃんとしたインデックス番号に正規化してくれるというもの。これを利用すれば、インデックス番号の列を得るのは比較的簡単です。
def iterate_by_slice(s: slice, length: int):
i, stop, step = s.indices(length)
if step > 0 :
while i < stop:
yield i
i += step
else:
while i > stop:
yield i
i += step
みんなの役に立つリスト的クラス、どんどん作っちゃってください。