シーケンスの一部をシーケンスのコピーを作らずにビルトイン関数に渡す方法(続き)

# -*- coding: utf-8 -*-

class Slicer():
    def __init__(self, seq, st, ed):
        self.seq = seq
        self.st = st
        self.ed = ed
    def __getitem__(self, idx):
        return self.seq[self.st + idx]
    def __setslice__(self, start, end, sub):
        self.seq[self.st:self.ed] = list(sub)  # ここはlist(sub)でインスタンス作成しているため効率良くない
    def __len__(self):
        return self.ed - self.st
    def getSeq(self):
        return self.seq

L = [99, 1, 2, 3]
L2 = Slicer(L, 1, 4)
L2[:] = reversed(L2)
L = L2.getSeq()
print L

実行結果:
[99, 3, 2, 1]

__setslice__()の実装は良くないのは置いておいて、reversed()はイテレータになってしまうので逆に使いづらい。また、list.reverse()をlistを継承してSlicerから呼べるようにしようと思ったら、うまくreverseされず良く分からなかった。


このSlicerの実装自体はあまり良いものと呼べない…。もう少し検討の余地がありそう。