class ReadonlyMemoryView:
def __init__(self, obj):
self.view = memoryview(obj)
def __getitem__(self, index):
value = self.view[index]
if isinstance(index, slice):
return self.__class__(value)
return value
def __setitem__(self, index, value):
raise TypeError('cannot modify read-only memory')
def __delitem__(self, index):
raise TypeError('cannot modify read-only memory')
def __getattr__(self, name):
return getattr(self.view, name)
m = ReadonlyMemoryView(bytearray(range(10)))
print(m[3:7][1:3].tolist())
m[3] = 1
Y2xhc3MgUmVhZG9ubHlNZW1vcnlWaWV3OgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iaik6CiAgICAgICAgc2VsZi52aWV3ID0gbWVtb3J5dmlldyhvYmopCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKICAgICAgICB2YWx1ZSA9IHNlbGYudmlld1tpbmRleF0KICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4LCBzbGljZSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyh2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIHZhbHVlKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2Nhbm5vdCBtb2RpZnkgcmVhZC1vbmx5IG1lbW9yeScpCgogICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGluZGV4KToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2Nhbm5vdCBtb2RpZnkgcmVhZC1vbmx5IG1lbW9yeScpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYudmlldywgbmFtZSkKCm0gPSBSZWFkb25seU1lbW9yeVZpZXcoYnl0ZWFycmF5KHJhbmdlKDEwKSkpCnByaW50KG1bMzo3XVsxOjNdLnRvbGlzdCgpKQptWzNdID0gMQ==