Syl*_*oux 5 python-3.x python-3.3 python-3.5
Python 3.8添加了该memoryview.toreadonly()方法。但是有没有办法在以前版本的Python中创建只读内存视图——特别是Python 3.5和3.3?
为了了解更多背景信息,我使用内存视图在对象之间共享大型二进制 blob 的部分。有时 blob 是内存中的byte对象,但有时它也是读/写映射文件。我想避免通过内存视图错误地修改底层文件。
您可以创建一个只读包装器/代理类来memoryview拒绝设置器和删除器调用。对于 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)
Run Code Online (Sandbox Code Playgroud)
以便:
m = ReadonlyMemoryView(bytearray(range(10)))
print(m[3:7][1:3].tolist())
m[3] = 1
Run Code Online (Sandbox Code Playgroud)
输出:
[4, 5]
Run Code Online (Sandbox Code Playgroud)
并产生:
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
Run Code Online (Sandbox Code Playgroud)
在 Python 2.7 上运行的代码演示:https://ideone.com/2iivHt