Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 616d285

Browse files
committed
Issue #2394: implement more of the memoryview API.
1 parent 4aeec04 commit 616d285

4 files changed

Lines changed: 418 additions & 25 deletions

File tree

Lib/test/test_codecs.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ def test_partial(self):
621621

622622
def test_bug1601501(self):
623623
# SF bug #1601501: check that the codec works with a buffer
624-
str(b"\xef\xbb\xbf", "utf-8-sig")
624+
self.assertEquals(str(b"\xef\xbb\xbf", "utf-8-sig"), "")
625625

626626
def test_bom(self):
627627
d = codecs.getincrementaldecoder("utf-8-sig")()

Lib/test/test_memoryview.py

Lines changed: 190 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,166 @@
55

66
import unittest
77
import test.support
8+
import sys
89

9-
class MemoryviewTest(unittest.TestCase):
10+
11+
class CommonMemoryTests:
12+
#
13+
# Tests common to direct memoryviews and sliced memoryviews
14+
#
15+
16+
base_object = b"abcdef"
17+
18+
def check_getitem_with_type(self, tp):
19+
b = tp(self.base_object)
20+
oldrefcount = sys.getrefcount(b)
21+
m = self._view(b)
22+
self.assertEquals(m[0], b"a")
23+
self.assert_(isinstance(m[0], bytes), type(m[0]))
24+
self.assertEquals(m[5], b"f")
25+
self.assertEquals(m[-1], b"f")
26+
self.assertEquals(m[-6], b"a")
27+
# Bounds checking
28+
self.assertRaises(IndexError, lambda: m[6])
29+
self.assertRaises(IndexError, lambda: m[-7])
30+
self.assertRaises(IndexError, lambda: m[sys.maxsize])
31+
self.assertRaises(IndexError, lambda: m[-sys.maxsize])
32+
# Type checking
33+
self.assertRaises(TypeError, lambda: m[None])
34+
self.assertRaises(TypeError, lambda: m[0.0])
35+
self.assertRaises(TypeError, lambda: m["a"])
36+
m = None
37+
self.assertEquals(sys.getrefcount(b), oldrefcount)
38+
39+
def test_getitem_readonly(self):
40+
self.check_getitem_with_type(bytes)
41+
42+
def test_getitem_writable(self):
43+
self.check_getitem_with_type(bytearray)
44+
45+
def test_setitem_readonly(self):
46+
b = self.base_object
47+
oldrefcount = sys.getrefcount(b)
48+
m = self._view(b)
49+
def setitem(value):
50+
m[0] = value
51+
self.assertRaises(TypeError, setitem, b"a")
52+
self.assertRaises(TypeError, setitem, 65)
53+
self.assertRaises(TypeError, setitem, memoryview(b"a"))
54+
m = None
55+
self.assertEquals(sys.getrefcount(b), oldrefcount)
56+
57+
def test_setitem_writable(self):
58+
b = bytearray(self.base_object)
59+
oldrefcount = sys.getrefcount(b)
60+
m = self._view(b)
61+
m[0] = b"0"
62+
self._check_contents(b, b"0bcdef")
63+
m[1:3] = b"12"
64+
self._check_contents(b, b"012def")
65+
m[1:1] = b""
66+
self._check_contents(b, b"012def")
67+
m[:] = b"abcdef"
68+
self._check_contents(b, b"abcdef")
69+
70+
# Overlapping copies of a view into itself
71+
m[0:3] = m[2:5]
72+
self._check_contents(b, b"cdedef")
73+
m[:] = b"abcdef"
74+
m[2:5] = m[0:3]
75+
self._check_contents(b, b"ababcf")
76+
77+
def setitem(key, value):
78+
m[key] = value
79+
# Bounds checking
80+
self.assertRaises(IndexError, setitem, 6, b"a")
81+
self.assertRaises(IndexError, setitem, -7, b"a")
82+
self.assertRaises(IndexError, setitem, sys.maxsize, b"a")
83+
self.assertRaises(IndexError, setitem, -sys.maxsize, b"a")
84+
# Wrong index/slice types
85+
self.assertRaises(TypeError, setitem, 0.0, b"a")
86+
self.assertRaises(TypeError, setitem, (0,), b"a")
87+
self.assertRaises(TypeError, setitem, "a", b"a")
88+
# Trying to resize the memory object
89+
self.assertRaises(ValueError, setitem, 0, b"")
90+
self.assertRaises(ValueError, setitem, 0, b"ab")
91+
self.assertRaises(ValueError, setitem, slice(1,1), b"a")
92+
self.assertRaises(ValueError, setitem, slice(0,2), b"a")
93+
94+
m = None
95+
self.assertEquals(sys.getrefcount(b), oldrefcount)
96+
97+
def test_len(self):
98+
self.assertEquals(len(self._view(self.base_object)), 6)
99+
100+
def test_tobytes(self):
101+
m = self._view(self.base_object)
102+
b = m.tobytes()
103+
self.assertEquals(b, b"abcdef")
104+
self.assert_(isinstance(b, bytes), type(b))
105+
106+
def test_tolist(self):
107+
m = self._view(self.base_object)
108+
l = m.tolist()
109+
self.assertEquals(l, list(b"abcdef"))
110+
111+
def test_compare(self):
112+
# memoryviews can compare for equality with other objects
113+
# having the buffer interface.
114+
m = self._view(self.base_object)
115+
for tp in (bytes, bytearray):
116+
self.assertTrue(m == tp(b"abcdef"))
117+
self.assertFalse(m != tp(b"abcdef"))
118+
self.assertFalse(m == tp(b"abcde"))
119+
self.assertTrue(m != tp(b"abcde"))
120+
self.assertFalse(m == tp(b"abcde1"))
121+
self.assertTrue(m != tp(b"abcde1"))
122+
self.assertTrue(m == m)
123+
self.assertTrue(m == m[:])
124+
self.assertTrue(m[0:6] == m[:])
125+
self.assertFalse(m[0:5] == m)
126+
127+
# Comparison with objects which don't support the buffer API
128+
self.assertFalse(m == "abc")
129+
self.assertTrue(m != "abc")
130+
self.assertFalse("abc" == m)
131+
self.assertTrue("abc" != m)
132+
133+
# Unordered comparisons
134+
for c in (m, b"abcdef"):
135+
self.assertRaises(TypeError, lambda: m < c)
136+
self.assertRaises(TypeError, lambda: c <= m)
137+
self.assertRaises(TypeError, lambda: m >= c)
138+
self.assertRaises(TypeError, lambda: c > m)
139+
140+
def check_attributes_with_type(self, tp):
141+
b = tp(self.base_object)
142+
m = self._view(b)
143+
self.assertEquals(m.format, 'B')
144+
self.assertEquals(m.itemsize, 1)
145+
self.assertEquals(m.ndim, 1)
146+
self.assertEquals(m.shape, (6,))
147+
self.assertEquals(m.size, 6)
148+
self.assertEquals(m.strides, (1,))
149+
self.assertEquals(m.suboffsets, None)
150+
return m
151+
152+
def test_attributes_readonly(self):
153+
m = self.check_attributes_with_type(bytes)
154+
self.assertEquals(m.readonly, True)
155+
156+
def test_attributes_writable(self):
157+
m = self.check_attributes_with_type(bytearray)
158+
self.assertEquals(m.readonly, False)
159+
160+
161+
class MemoryviewTest(unittest.TestCase, CommonMemoryTests):
162+
163+
def _view(self, obj):
164+
return memoryview(obj)
165+
166+
def _check_contents(self, obj, contents):
167+
self.assertEquals(obj, contents)
10168

11169
def test_constructor(self):
12170
ob = b'test'
@@ -17,8 +175,38 @@ def test_constructor(self):
17175
self.assertRaises(TypeError, memoryview, argument=ob)
18176
self.assertRaises(TypeError, memoryview, ob, argument=True)
19177

178+
179+
class MemorySliceTest(unittest.TestCase, CommonMemoryTests):
180+
base_object = b"XabcdefY"
181+
182+
def _view(self, obj):
183+
m = memoryview(obj)
184+
return m[1:7]
185+
186+
def _check_contents(self, obj, contents):
187+
self.assertEquals(obj[1:7], contents)
188+
189+
def test_refs(self):
190+
m = memoryview(b"ab")
191+
oldrefcount = sys.getrefcount(m)
192+
m[1:2]
193+
self.assertEquals(sys.getrefcount(m), oldrefcount)
194+
195+
196+
class MemorySliceSliceTest(unittest.TestCase, CommonMemoryTests):
197+
base_object = b"XabcdefY"
198+
199+
def _view(self, obj):
200+
m = memoryview(obj)
201+
return m[:7][1:]
202+
203+
def _check_contents(self, obj, contents):
204+
self.assertEquals(obj[1:7], contents)
205+
206+
20207
def test_main():
21-
test.support.run_unittest(MemoryviewTest)
208+
test.support.run_unittest(
209+
MemoryviewTest, MemorySliceTest, MemorySliceSliceTest)
22210

23211

24212
if __name__ == "__main__":

Misc/NEWS

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ What's new in Python 3.0b3?
1212
Core and Builtins
1313
-----------------
1414

15+
- Issue #2394: implement more of the memoryview API, with the caveat that
16+
only one-dimensional contiguous buffers are supported and exercised right
17+
now. Slicing, slice assignment and comparison (equality and inequality)
18+
have been added. Also, the tolist() method has been implemented, but only
19+
for byte buffers. Endly, the API has been updated to return bytes objects
20+
wherever it used to return bytearrays.
21+
1522
- Issue #3560: clean up the new C PyMemoryView API so that naming is
1623
internally consistent; add macros PyMemoryView_GET_BASE() and
1724
PyMemoryView_GET_BUFFER() to access useful properties of a memory views

0 commit comments

Comments
 (0)