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

问题描述 投票:0回答:1

Python 3.8 添加了

memoryview.toreadonly()
方法。但是有没有办法在以前版本的 Python(特别是 Python 3.5 和 3.3)中创建只读内存视图?

为了了解更多背景信息,我使用内存视图在对象之间共享大型二进制 blob 的部分。有时 blob 是内存中的

byte
对象,但有时它也是读/写映射文件。我希望避免通过内存视图错误地修改底层文件。

python-3.x python-3.5 python-3.3
1个回答
0
投票

您可以为

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

© www.soinside.com 2019 - 2024. All rights reserved.