在 Python 3.8 之前的版本中将内存视图设置为只读

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对象,但有时它也是读/写映射文件。我想避免通过内存视图错误地修改底层文件。

blh*_*ing 0

您可以创建一个只读包装器/代理类来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