return 1
if size is None:
size = -1
- elif not isinstance(size, int):
- raise TypeError("size must be an integer")
+ else:
+ try:
+ size_index = size.__index__
+ except AttributeError:
+ raise TypeError(f"{size!r} is not an integer")
+ else:
+ size = size_index()
res = bytearray()
while size < 0 or len(res) < size:
b = self.read(nreadahead())
raise ValueError("read from closed file")
if size is None:
size = -1
+ else:
+ try:
+ size_index = size.__index__
+ except AttributeError:
+ raise TypeError(f"{size!r} is not an integer")
+ else:
+ size = size_index()
if size < 0:
size = len(self._buffer)
if len(self._buffer) <= self._pos:
if self.closed:
raise ValueError("seek on closed file")
try:
- pos.__index__
- except AttributeError as err:
- raise TypeError("an integer is required") from err
+ pos_index = pos.__index__
+ except AttributeError:
+ raise TypeError(f"{pos!r} is not an integer")
+ else:
+ pos = pos_index()
if whence == 0:
if pos < 0:
raise ValueError("negative seek position %r" % (pos,))
pos = self._pos
else:
try:
- pos.__index__
- except AttributeError as err:
- raise TypeError("an integer is required") from err
+ pos_index = pos.__index__
+ except AttributeError:
+ raise TypeError(f"{pos!r} is not an integer")
+ else:
+ pos = pos_index()
if pos < 0:
raise ValueError("negative truncate position %r" % (pos,))
del self._buffer[pos:]
self._checkReadable()
if size is None:
size = -1
+ else:
+ try:
+ size_index = size.__index__
+ except AttributeError:
+ raise TypeError(f"{size!r} is not an integer")
+ else:
+ size = size_index()
decoder = self._decoder or self._get_decoder()
- try:
- size.__index__
- except AttributeError as err:
- raise TypeError("an integer is required") from err
if size < 0:
# Read everything.
result = (self._get_decoded_chars() +
raise ValueError("read from closed file")
if size is None:
size = -1
- elif not isinstance(size, int):
- raise TypeError("size must be an integer")
+ else:
+ try:
+ size_index = size.__index__
+ except AttributeError:
+ raise TypeError(f"{size!r} is not an integer")
+ else:
+ size = size_index()
# Grab all the decoded text (we will rewind any extra bits later).
line = self._get_decoded_chars()
import pickle
import sys
+class IntLike:
+ def __init__(self, num):
+ self._num = num
+ def __index__(self):
+ return self._num
+ __int__ = __index__
+
class MemorySeekTestMixin:
def testInit(self):
memio = self.ioclass(buf)
self.assertRaises(ValueError, memio.truncate, -1)
+ self.assertRaises(ValueError, memio.truncate, IntLike(-1))
memio.seek(6)
+ self.assertEqual(memio.truncate(IntLike(8)), 8)
+ self.assertEqual(memio.getvalue(), buf[:8])
self.assertEqual(memio.truncate(), 6)
self.assertEqual(memio.getvalue(), buf[:6])
self.assertEqual(memio.truncate(4), 4)
self.assertRaises(TypeError, memio.truncate, '0')
memio.close()
self.assertRaises(ValueError, memio.truncate, 0)
+ self.assertRaises(ValueError, memio.truncate, IntLike(0))
def test_init(self):
buf = self.buftype("1234567890")
self.assertEqual(memio.read(900), buf[5:])
self.assertEqual(memio.read(), self.EOF)
memio.seek(0)
+ self.assertEqual(memio.read(IntLike(0)), self.EOF)
+ self.assertEqual(memio.read(IntLike(1)), buf[:1])
+ self.assertEqual(memio.read(IntLike(4)), buf[1:5])
+ self.assertEqual(memio.read(IntLike(900)), buf[5:])
+ memio.seek(0)
self.assertEqual(memio.read(), buf)
self.assertEqual(memio.read(), self.EOF)
self.assertEqual(memio.tell(), 10)
memio.seek(0)
self.assertEqual(memio.read(-1), buf)
memio.seek(0)
+ self.assertEqual(memio.read(IntLike(-1)), buf)
+ memio.seek(0)
self.assertEqual(type(memio.read()), type(buf))
memio.seek(100)
self.assertEqual(type(memio.read()), type(buf))
memio.seek(len(buf) + 1)
self.assertEqual(memio.read(1), self.EOF)
memio.seek(len(buf) + 1)
+ self.assertEqual(memio.read(IntLike(1)), self.EOF)
+ memio.seek(len(buf) + 1)
self.assertEqual(memio.read(), self.EOF)
memio.close()
self.assertRaises(ValueError, memio.read)
memio = self.ioclass(buf * 2)
self.assertEqual(memio.readline(0), self.EOF)
+ self.assertEqual(memio.readline(IntLike(0)), self.EOF)
self.assertEqual(memio.readline(), buf)
self.assertEqual(memio.readline(), buf)
self.assertEqual(memio.readline(), self.EOF)
self.assertEqual(memio.readline(5), buf[5:10])
self.assertEqual(memio.readline(5), buf[10:15])
memio.seek(0)
+ self.assertEqual(memio.readline(IntLike(5)), buf[:5])
+ self.assertEqual(memio.readline(IntLike(5)), buf[5:10])
+ self.assertEqual(memio.readline(IntLike(5)), buf[10:15])
+ memio.seek(0)
self.assertEqual(memio.readline(-1), buf)
memio.seek(0)
+ self.assertEqual(memio.readline(IntLike(-1)), buf)
+ memio.seek(0)
self.assertEqual(memio.readline(0), self.EOF)
+ self.assertEqual(memio.readline(IntLike(0)), self.EOF)
# Issue #24989: Buffer overread
memio.seek(len(buf) * 2 + 1)
self.assertEqual(memio.readline(), self.EOF)