import collections
class SliceView(collections.abc.Sequence):
def __init__(self, seq, start=None, stop=None, step=None):
self.seq = seq
sl = slice(start, stop, step)
self.start, self.stop, self.step = sl.indices(len(seq))
def __len__(self):
return len(range(self.start, self.stop, self.step))
def __getitem__(self, idx):
if isinstance(idx, slice):
start, stop, step = idx.indices(len(self))
return type(self)(self.seq, start, stop, step)
if idx < 0:
idx += self.stop
if idx < self.start:
raise IndexError
else:
idx += self.start
if idx >= self.stop:
raise IndexError
return self.seq[idx]
def __str__(self):
return str(list(self))
base = SliceView([1, 2, 3])
print(list(base))
print(list(base[1:]))
print(list(base[1:][1:]))
aW1wb3J0IGNvbGxlY3Rpb25zCgpjbGFzcyBTbGljZVZpZXcoY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXEsIHN0YXJ0PU5vbmUsIHN0b3A9Tm9uZSwgc3RlcD1Ob25lKToKICAgICAgICBzZWxmLnNlcSA9IHNlcQogICAgICAgIHNsID0gc2xpY2Uoc3RhcnQsIHN0b3AsIHN0ZXApCiAgICAgICAgc2VsZi5zdGFydCwgc2VsZi5zdG9wLCBzZWxmLnN0ZXAgPSBzbC5pbmRpY2VzKGxlbihzZXEpKQogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihyYW5nZShzZWxmLnN0YXJ0LCBzZWxmLnN0b3AsIHNlbGYuc3RlcCkpCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaWR4KToKICAgICAgICBpZiBpc2luc3RhbmNlKGlkeCwgc2xpY2UpOgogICAgICAgICAgICBzdGFydCwgc3RvcCwgc3RlcCA9IGlkeC5pbmRpY2VzKGxlbihzZWxmKSkKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikoc2VsZi5zZXEsIHN0YXJ0LCBzdG9wLCBzdGVwKQogICAgICAgIGlmIGlkeCA8IDA6CiAgICAgICAgICAgIGlkeCArPSBzZWxmLnN0b3AKICAgICAgICAgICAgaWYgaWR4IDwgc2VsZi5zdGFydDoKICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZHggKz0gc2VsZi5zdGFydAogICAgICAgICAgICBpZiBpZHggPj0gc2VsZi5zdG9wOgogICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgogICAgICAgIHJldHVybiBzZWxmLnNlcVtpZHhdCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKGxpc3Qoc2VsZikpCgpiYXNlID0gU2xpY2VWaWV3KFsxLCAyLCAzXSkKcHJpbnQobGlzdChiYXNlKSkKcHJpbnQobGlzdChiYXNlWzE6XSkpCnByaW50KGxpc3QoYmFzZVsxOl1bMTpdKSk=