bpo-33176: Add a toreadonly() method to memoryviews. (GH-6466) · pythoncapi/cpython@480ab05 · GitHub
Skip to content

Commit 480ab05

Browse files
authored
bpo-33176: Add a toreadonly() method to memoryviews. (pythonGH-6466)
1 parent b1dc075 commit 480ab05

5 files changed

Lines changed: 73 additions & 16 deletions

File tree

Doc/library/stdtypes.rst

Lines changed: 19 additions & 0 deletions

Lib/test/test_buffer.py

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -924,23 +924,30 @@ def verify(self, result, obj=-1,
924924
except BufferError: # re-exporter does not provide full information
925925
return
926926
ex = result.obj if isinstance(result, memoryview) else result
927-
self.assertIs(m.obj, ex)
928-
self.assertEqual(m.nbytes, expected_len)
929-
self.assertEqual(m.itemsize, itemsize)
930-
self.assertEqual(m.format, fmt)
931-
self.assertEqual(m.readonly, readonly)
932-
self.assertEqual(m.ndim, ndim)
933-
self.assertEqual(m.shape, tuple(shape))
934-
if not (sliced and suboffsets):
935-
self.assertEqual(m.strides, tuple(strides))
936-
self.assertEqual(m.suboffsets, tuple(suboffsets))
937-
938-
n = 1 if ndim == 0 else len(lst)
939-
self.assertEqual(len(m), n)
940927

941-
rep = result.tolist() if fmt else result.tobytes()
942-
self.assertEqual(rep, lst)
943-
self.assertEqual(m, result)
928+
def check_memoryview(m, expected_readonly=readonly):
929+
self.assertIs(m.obj, ex)
930+
self.assertEqual(m.nbytes, expected_len)
931+
self.assertEqual(m.itemsize, itemsize)
932+
self.assertEqual(m.format, fmt)
933+
self.assertEqual(m.readonly, expected_readonly)
934+
self.assertEqual(m.ndim, ndim)
935+
self.assertEqual(m.shape, tuple(shape))
936+
if not (sliced and suboffsets):
937+
self.assertEqual(m.strides, tuple(strides))
938+
self.assertEqual(m.suboffsets, tuple(suboffsets))
939+
940+
n = 1 if ndim == 0 else len(lst)
941+
self.assertEqual(len(m), n)
942+
943+
rep = result.tolist() if fmt else result.tobytes()
944+
self.assertEqual(rep, lst)
945+
self.assertEqual(m, result)
946+
947+
check_memoryview(m)
948+
with m.toreadonly() as mm:
949+
check_memoryview(mm, expected_readonly=True)
950+
m.tobytes() # Releasing mm didn't release m
944951

945952
def verify_getbuf(self, orig_ex, ex, req, sliced=False):
946953
def simple_fmt(ex):

Lib/test/test_memoryview.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,17 @@ def test_reversed(self):
362362
self.assertEqual(list(reversed(m)), aslist)
363363
self.assertEqual(list(reversed(m)), list(m[::-1]))
364364

365+
def test_toreadonly(self):
366+
for tp in self._types:
367+
b = tp(self._source)
368+
m = self._view(b)
369+
mm = m.toreadonly()
370+
self.assertTrue(mm.readonly)
371+
self.assertTrue(memoryview(mm).readonly)
372+
self.assertEqual(mm.tolist(), m.tolist())
373+
mm.release()
374+
m.tolist()
375+
365376
def test_issue22668(self):
366377
a = array.array('H', [256, 256, 256, 256])
367378
x = memoryview(a)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add a ``toreadonly()`` method to memoryviews.

Objects/memoryobject.c

Lines changed: 19 additions & 0 deletions

0 commit comments

Comments
 (0)