Skip to content

Commit 230ffea

Browse files
miss-islingtonserhiy-storchaka
authored andcommitted
bpo-32110: codecs.StreamReader.read(n) now returns not more than n (GH-4499) (#4622)
characters/bytes for non-negative n. This makes it compatible with read() methods of other file-like objects. (cherry picked from commit 219c2de)
1 parent 6979fcd commit 230ffea

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
@@ -479,15 +479,17 @@ def read(self, size=-1, chars=-1, firstline=False):
479479
self.charbuffer = self._empty_charbuffer.join(self.linebuffer)
480480
self.linebuffer = None
481481

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