mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Make sure that writing an array instance returns the number of bytes,
not the number of array elements.
This commit is contained in:
parent
aa43ed95cd
commit
d410395ea7
2 changed files with 17 additions and 1 deletions
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue