Skip to content

Commit 08bd7da

Browse files
committed
Do not return an empty bytes object for size=0
1 parent c16bebf commit 08bd7da

File tree

5 files changed

+11
-8
lines changed

5 files changed

+11
-8
lines changed

Doc/library/io.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ than raw I/O does.
744744
Return bytes from the current position onwards without advancing the position.
745745
At least one byte of data is returned if not at EOF.
746746
Return an empty :class:`bytes` object at EOF.
747-
If the size argument is negative or larger than the number of available bytes,
747+
If the size argument is less than one or larger than the number of available bytes,
748748
a copy of the buffer from the current position until the end is returned.
749749

750750
.. versionadded:: 3.15

Lib/_pyio.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -999,7 +999,7 @@ def tell(self):
999999
def peek(self, size=1):
10001000
if self.closed:
10011001
raise ValueError("peek on closed file")
1002-
if size < 0:
1002+
if size < 1:
10031003
return self._buffer[self._pos:]
10041004
return self._buffer[self._pos:self._pos + size]
10051005

Lib/test/test_io/test_memoryio.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,27 +575,30 @@ def test_peek(self):
575575
self.assertEqual(memio.peek(), buf[:1])
576576
self.assertEqual(memio.peek(3), buf[:3])
577577
self.assertEqual(memio.peek(5), buf[:5])
578-
self.assertEqual(memio.peek(0), b"")
578+
self.assertEqual(memio.peek(0), buf)
579579
self.assertEqual(memio.peek(len(buf) + 100), buf)
580580
self.assertEqual(memio.peek(-1), buf)
581581
self.assertEqual(memio.tell(), 0)
582+
582583
memio.read(1)
583584
self.assertEqual(memio.tell(), 1)
584585
self.assertEqual(memio.peek(1), buf[1:2])
585586
self.assertEqual(memio.peek(), buf[1:2])
586587
self.assertEqual(memio.peek(3), buf[1:4])
587588
self.assertEqual(memio.peek(5), buf[1:6])
588-
self.assertEqual(memio.peek(0), b"")
589+
self.assertEqual(memio.peek(0), buf[1:])
589590
self.assertEqual(memio.peek(len(buf) + 100), buf[1:])
590591
self.assertEqual(memio.peek(-1), buf[1:])
591592
self.assertEqual(memio.tell(), 1)
593+
592594
memio.read()
593595
self.assertEqual(memio.tell(), len(buf))
594596
self.assertEqual(memio.peek(1), self.EOF)
595597
self.assertEqual(memio.peek(3), self.EOF)
596598
self.assertEqual(memio.peek(5), self.EOF)
597599
self.assertEqual(memio.peek(0), b"")
598600
self.assertEqual(memio.tell(), len(buf))
601+
599602
# Peeking works after writing
600603
abc = self.buftype("abc")
601604
memio.write(abc)

Modules/_io/bytesio.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ _io.BytesIO.peek
517517
518518
Return bytes from the stream without advancing the position.
519519
520-
If the size argument is negative, read until EOF is reached.
520+
If the size argument is zero or negative, read until EOF is reached.
521521
Return an empty bytes object at EOF.
522522
[clinic start generated code]*/
523523

@@ -529,9 +529,9 @@ _io_BytesIO_peek_impl(bytesio *self, Py_ssize_t size)
529529

530530
/* adjust invalid sizes */
531531
Py_ssize_t n = self->string_size - self->pos;
532-
if (size < 0 || size > n) {
532+
if (size < 1 || size > n) {
533533
size = n;
534-
/* n can be negative after truncate() or seek() */
534+
/* size can be negative after truncate() or seek() */
535535
if (size < 0) {
536536
size = 0;
537537
}

Modules/_io/clinic/bytesio.c.h

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)