diff --git a/Lib/_pyio.py b/Lib/_pyio.py index 1118b54633b7cc1..9035db0964544fc 100644 --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1003,9 +1003,19 @@ def tell(self): def peek(self, size=0): if self.closed: raise ValueError("peek on closed file") + try: + size_index = size.__index__ + except AttributeError: + raise TypeError(f"{size!r} is not an integer") + else: + size = size_index() + if size < 1: - return self._buffer[self._pos:self._pos + io.DEFAULT_BUFFER_SIZE] - return self._buffer[self._pos:self._pos + size] + size = io.DEFAULT_BUFFER_SIZE + + with self._lock: + b = self._buffer[self._pos:self._pos + size] + return b.take_bytes() def truncate(self, pos=None): if self.closed: diff --git a/Lib/test/test_io/test_memoryio.py b/Lib/test/test_io/test_memoryio.py index f53525d77b7dbaf..b929b56a7d81213 100644 --- a/Lib/test/test_io/test_memoryio.py +++ b/Lib/test/test_io/test_memoryio.py @@ -570,6 +570,11 @@ def test_peek(self): buf = self.buftype("1234567890") with self.ioclass(buf) as memio: self.assertEqual(memio.tell(), 0) + # bytearray(b'1') == b'1', so the type has to be asserted separately. + self.assertIsInstance(memio.peek(), bytes) + self.assertIsInstance(memio.peek(1), bytes) + self.assertEqual(memio.peek(IntLike(3)), buf[:3]) + self.assertRaises(TypeError, memio.peek, 1.5) self.assertEqual(memio.peek(1), buf[:1]) self.assertEqual(memio.peek(1), buf[:1]) self.assertEqual(memio.peek(), buf)