memoryview.toreadonly()
方法。但是有没有办法在以前版本的 Python(特别是 Python 3.5 和 3.3)中创建只读内存视图?
为了了解更多背景信息,我使用内存视图在对象之间共享大型二进制 blob 的部分。有时 blob 是内存中的
byte
对象,但有时它也是读/写映射文件。我希望避免通过内存视图错误地修改底层文件。
您可以为
memoryview
创建一个只读包装器/代理类来拒绝setter和deleter调用。对于 getter 调用,如果请求切片,请确保将切片视图包装在只读代理类的另一个实例中:
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
输出:
[4, 5]
并产生:
Traceback (most recent call last):
File "prog.py", line 22, in <module>
File "prog.py", line 12, in __setitem__
TypeError: cannot modify read-only memory
在 Python 2.7 上运行的代码演示:https://ideone.com/2iivHt