Make sure that writing an array instance returns the number of bytes,

not the number of array elements.
This commit is contained in:
Guido van Rossum 2007-04-12 05:44:49 +00:00
parent aa43ed95cd
commit d410395ea7
2 changed files with 17 additions and 1 deletions

View file

@ -17,6 +17,7 @@ XXX need to support 1 meaning line-buffered
XXX don't use assert to validate input requirements XXX don't use assert to validate input requirements
XXX whenever an argument is None, use the default value XXX whenever an argument is None, use the default value
XXX read/write ops should check readable/writable XXX read/write ops should check readable/writable
XXX buffered readinto should work with arbitrary buffer objects
""" """
__author__ = ("Guido van Rossum <guido@python.org>, " __author__ = ("Guido van Rossum <guido@python.org>, "
@ -205,6 +206,7 @@ class IOBase:
This is a no-op for read-only and non-blocking streams. This is a no-op for read-only and non-blocking streams.
""" """
# XXX Should this return the number of bytes written???
__closed = False __closed = False
@ -431,6 +433,7 @@ class BufferedIOBase(IOBase):
Raises BlockingIOError if the underlying raw stream has no Raises BlockingIOError if the underlying raw stream has no
data at the moment. data at the moment.
""" """
# XXX This ought to work with anything that supports the buffer API
data = self.read(len(b)) data = self.read(len(b))
n = len(data) n = len(data)
b[:n] = data b[:n] = data
@ -676,7 +679,9 @@ class BufferedWriter(_BufferedIOMixin):
# We can't accept anything else. # We can't accept anything else.
# XXX Why not just let the exception pass through? # XXX Why not just let the exception pass through?
raise BlockingIOError(e.errno, e.strerror, 0) raise BlockingIOError(e.errno, e.strerror, 0)
before = len(self._write_buf)
self._write_buf.extend(b) self._write_buf.extend(b)
written = len(self._write_buf) - before
if len(self._write_buf) > self.buffer_size: if len(self._write_buf) > self.buffer_size:
try: try:
self.flush() self.flush()
@ -687,7 +692,7 @@ class BufferedWriter(_BufferedIOMixin):
overage = len(self._write_buf) - self.max_buffer_size overage = len(self._write_buf) - self.max_buffer_size
self._write_buf = self._write_buf[:self.max_buffer_size] self._write_buf = self._write_buf[:self.max_buffer_size]
raise BlockingIOError(e.errno, e.strerror, overage) raise BlockingIOError(e.errno, e.strerror, overage)
return len(b) return written
def flush(self): def flush(self):
written = 0 written = 0

View file

@ -2,6 +2,7 @@
import sys import sys
import time import time
import array
import unittest import unittest
from itertools import chain from itertools import chain
from test import test_support from test import test_support
@ -235,6 +236,16 @@ class IOTest(unittest.TestCase):
self.assertEqual(f.read(), b"xxx") self.assertEqual(f.read(), b"xxx")
f.close() f.close()
def test_array_writes(self):
a = array.array('i', range(10))
n = len(buffer(a))
f = io.open(test_support.TESTFN, "wb", 0)
self.assertEqual(f.write(a), n)
f.close()
f = io.open(test_support.TESTFN, "wb")
self.assertEqual(f.write(a), n)
f.close()
class MemorySeekTestMixin: class MemorySeekTestMixin: