diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/io.py | 22 | ||||
-rw-r--r-- | Lib/test/test_io.py | 12 |
2 files changed, 26 insertions, 8 deletions
@@ -298,17 +298,23 @@ class IOBase: ### Readline ### - def readline(self, sizehint: int = -1) -> bytes: - """For backwards compatibility, a (slow) readline().""" - if sizehint is None: - sizehint = -1 - res = b"" - while sizehint < 0 or len(res) < sizehint: - b = self.read(1) + def readline(self, limit: int = -1) -> bytes: + """For backwards compatibility, a (slowish) readline().""" + if limit is None: + limit = -1 + res = bytes() + while limit < 0 or len(res) < limit: + readahead = self.peek(1, unsafe=True) + if not readahead: + break + n = (readahead.find(b"\n") + 1) or len(readahead) + if limit >= 0: + n = min(n, limit) + b = self.read(n) if not b: break res += b - if b == b"\n": + if res.endswith(b"\n"): break return res diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index c98d61f..c555623 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -168,6 +168,18 @@ class IOTest(unittest.TestCase): self.read_ops(f, True) f.close() + def test_readline(self): + f = io.open(test_support.TESTFN, "wb") + f.write(b"abc\ndef\nxyzzy\nfoo") + f.close() + f = io.open(test_support.TESTFN, "rb") + self.assertEqual(f.readline(), b"abc\n") + self.assertEqual(f.readline(10), b"def\n") + self.assertEqual(f.readline(2), b"xy") + self.assertEqual(f.readline(4), b"zzy\n") + self.assertEqual(f.readline(), b"foo") + f.close() + def test_raw_bytes_io(self): f = io.BytesIO() self.write_ops(f) |