将memoryview的slice放入后备缓冲区

时间:2019-03-15 18:45:11

标签: python python-3.x memoryview

考虑到memoryview是其支持数据的一部分,我如何获得slice当前代表的memoryview

例如,说给我这个memoryview,但是不知道如何切成薄片:

m = memoryview(b'This is a test')[1:5]

如何从slice(1, 5, None)获得m?如果存在这样的东西并称为get_memoryview_slice,那么我期望memoryview(m.obj)[get_memoryview_slice(m)]创建一个与m相同的新内存片(指向内存中的同一区域)。

翻阅Python docs for memoryview,我看到如何获得除起始索引(以上示例中的{1之外的所有内容; 5可以从shape和{{ 1}}源自None)。

C documentation揭示了一些更有希望的东西。即,stridesPyMemoryView_GET_BUFFER看起来像可以用来查找起始索引。 PyMemoryView_GET_BASE是指向内存视图指向的数据开头的指针。我怀疑它不会像PyMemoryView_GET_BUFFER(m)->buf那样容易,因为其中第一个似乎是Python对象(任何符合缓冲区的东西,因此它可能是PyMemoryView_GET_BASE(m) - PyMemoryView_GET_BUFFER(m)->bufbytearray等)。但是,这似乎是到达那里的途径。

不幸的是,我相信这样的方法至少会依赖cpython,并且可能需要编写C扩展。我宁愿避免这两种情况。

我目前正在通过bytes实现(memoryobject.hmemoryview.c)进行探索。我尚未找到可能提供间接获取偏移量的任何位置(例如,memoryview使用repr的地址而不是基础缓冲区的地址)。

对于我的特定用例,这纯粹是用于注释具有更有用的元数据的异常(例如,“字节偏移4242处存在此错误”,而不仅仅是“存在此错误”)。因此,我可以接受一些棘手或棘手的事情,但是,显然,如果有一种批准的方法可以做到这一点。理想情况下,我还避免了将memoryview包装在自己的对象中,并重新实现其所有方法来跟踪切片。

0 个答案:

没有答案