Skip to content

Commit fc73c54

Browse files
miss-islingtonserhiy-storchaka
authored andcommitted
bpo-32110: codecs.StreamReader.read(n) now returns not more than n (GH-4499) (#4623)
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 180372c commit fc73c54

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
@@ -472,15 +472,17 @@ def read(self, size=-1, chars=-1, firstline=False):
472472
self.charbuffer = "".join(self.linebuffer)
473473
self.linebuffer = None
474474

475+
if chars < 0:
476+
# For compatibility with other read() methods that take a
477+
# single argument
478+
chars = size
479+
475480
# read until we get the required number of characters (if available)
476481
while True:
477482
# can the request be satisfied from the character buffer?
478483
if chars >= 0:
479484
if len(self.charbuffer) >= chars:
480485
break
481-
elif size >= 0:
482-
if len(self.charbuffer) >= size:
483-
break
484486
# we need more data
485487
if size < 0:
486488
newdata = self.stream.read()

Lib/test/test_codecs.py

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

152+
# Issue #32110: Test readline() followed by read(n)
153+
f = getreader()
154+
self.assertEqual(f.readline(), lines[0])
155+
self.assertEqual(f.read(1), lines[1][0])
156+
self.assertEqual(f.read(0), '')
157+
self.assertEqual(f.read(100), data[len(lines[0]) + 1:][:100])
158+
152159
# Issue #16636: Test readline() followed by readlines()
153160
f = getreader()
154161
self.assertEqual(f.readline(), lines[0])
155162
self.assertEqual(f.readlines(), lines[1:])
156163
self.assertEqual(f.read(), '')
157164

158-
# Test read() followed by read()
165+
# Test read(n) followed by read()
159166
f = getreader()
160167
self.assertEqual(f.read(size=40, chars=5), data[:5])
161168
self.assertEqual(f.read(), data[5:])
162169
self.assertEqual(f.read(), '')
163170

164-
# Issue #12446: Test read() followed by readlines()
171+
# Issue #32110: Test read(n) followed by read(n)
172+
f = getreader()
173+
self.assertEqual(f.read(size=40, chars=5), data[:5])
174+
self.assertEqual(f.read(1), data[5])
175+
self.assertEqual(f.read(0), '')
176+
self.assertEqual(f.read(100), data[6:106])
177+
178+
# Issue #12446: Test read(n) followed by readlines()
165179
f = getreader()
166180
self.assertEqual(f.read(size=40, chars=5), data[:5])
167181
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)