Skip to content

Commit 219c2de

Browse files
bpo-32110: codecs.StreamReader.read(n) now returns not more than n (#4499)
characters/bytes for non-negative n. This makes it compatible with read() methods of other file-like objects.
1 parent 23df2d1 commit 219c2de

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

Lib/codecs.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -480,15 +480,17 @@ def read(self, size=-1, chars=-1, firstline=False):
480480
self.charbuffer = self._empty_charbuffer.join(self.linebuffer)
481481
self.linebuffer = None
482482

483+
if chars < 0:
484+
# For compatibility with other read() methods that take a
485+
# single argument
486+
chars = size
487+
483488
# read until we get the required number of characters (if available)
484489
while True:
485490
# can the request be satisfied from the character buffer?
486491
if chars >= 0:
487492
if len(self.charbuffer) >= chars:
488493
break
489-
elif size >= 0:
490-
if len(self.charbuffer) >= size:
491-
break
492494
# we need more data
493495
if size < 0:
494496
newdata = self.stream.read()

Lib/test/test_codecs.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,19 +196,33 @@ def getreader():
196196
self.assertEqual(f.read(), ''.join(lines[1:]))
197197
self.assertEqual(f.read(), '')
198198

199+
# Issue #32110: Test readline() followed by read(n)
200+
f = getreader()
201+
self.assertEqual(f.readline(), lines[0])
202+
self.assertEqual(f.read(1), lines[1][0])
203+
self.assertEqual(f.read(0), '')
204+
self.assertEqual(f.read(100), data[len(lines[0]) + 1:][:100])
205+
199206
# Issue #16636: Test readline() followed by readlines()
200207
f = getreader()
201208
self.assertEqual(f.readline(), lines[0])
202209
self.assertEqual(f.readlines(), lines[1:])
203210
self.assertEqual(f.read(), '')
204211

205-
# Test read() followed by read()
212+
# Test read(n) followed by read()
206213
f = getreader()
207214
self.assertEqual(f.read(size=40, chars=5), data[:5])
208215
self.assertEqual(f.read(), data[5:])
209216
self.assertEqual(f.read(), '')
210217

211-
# Issue #12446: Test read() followed by readlines()
218+
# Issue #32110: Test read(n) followed by read(n)
219+
f = getreader()
220+
self.assertEqual(f.read(size=40, chars=5), data[:5])
221+
self.assertEqual(f.read(1), data[5])
222+
self.assertEqual(f.read(0), '')
223+
self.assertEqual(f.read(100), data[6:106])
224+
225+
# Issue #12446: Test read(n) followed by readlines()
212226
f = getreader()
213227
self.assertEqual(f.read(size=40, chars=5), data[:5])
214228
self.assertEqual(f.readlines(), [lines[0][5:]] + lines[1:])
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
``codecs.StreamReader.read(n)`` now returns not more than *n*
2+
characters/bytes for non-negative *n*. This makes it compatible with
3+
``read()`` methods of other file-like objects.

0 commit comments

Comments
 (0)