シーケンスの一部をシーケンスのコピーを作らずにビルトイン関数に渡す方法(続き)
# -*- 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の実装自体はあまり良いものと呼べない…。もう少し検討の余地がありそう。