diff options
author | Martin Panter <vadmium+py@gmail.com> | 2016-06-03 05:59:20 (GMT) |
---|---|---|
committer | Martin Panter <vadmium+py@gmail.com> | 2016-06-03 05:59:20 (GMT) |
commit | c9813d83f78c1eed12aebc286d6df0e9a5d90d04 (patch) | |
tree | ad5967e5bcc619be26198efbf78502578e5da615 /Doc | |
parent | 9aabaccb7632a35da37b3d9c58b6ee0aab3ac547 (diff) | |
download | cpython-c9813d83f78c1eed12aebc286d6df0e9a5d90d04.zip cpython-c9813d83f78c1eed12aebc286d6df0e9a5d90d04.tar.gz cpython-c9813d83f78c1eed12aebc286d6df0e9a5d90d04.tar.bz2 |
Issue #20699: Document that “io” methods should accept memoryview
This matches the usage by BufferedReader, BufferedWriter, etc. Also document
and test that the write() methods should only access their argument before
they return.
Diffstat (limited to 'Doc')
-rw-r--r-- | Doc/library/io.rst | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/Doc/library/io.rst b/Doc/library/io.rst index 3d28e63..d3cdbf1 100644 --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -225,10 +225,15 @@ I/O Base Classes support are called. The basic type used for binary data read from or written to a file is - :class:`bytes` (also known as :class:`str`). :class:`bytearray`\s are - accepted too, and in some cases (such as :class:`readinto`) required. + :class:`bytes` (also known as :class:`str`). Method arguments may + also be :class:`bytearray` or :class:`memoryview` of arrays of bytes. + In some cases, such as :meth:`~RawIOBase.readinto`, a writable object + such as :class:`bytearray` is required. Text I/O classes work with :class:`unicode` data. + .. versionchanged:: 2.7 + Implementations should support :class:`memoryview` arguments. + Note that calling any method (even inquiries) on a closed stream is undefined. Implementations may raise :exc:`IOError` in this case. @@ -383,18 +388,24 @@ I/O Base Classes .. method:: readinto(b) - Read up to len(b) bytes into bytearray *b* and return the number - of bytes read. If the object is in non-blocking mode and no + Read up to len(b) bytes into *b*, and return the number + of bytes read. The object *b* should be a pre-allocated, writable + array of bytes, either :class:`bytearray` or :class:`memoryview`. + If the object is in non-blocking mode and no bytes are available, ``None`` is returned. .. method:: write(b) - Write the given bytes or bytearray object, *b*, to the underlying raw - stream and return the number of bytes written. This can be less than + Write *b* to the underlying raw stream, and return the + number of bytes written. The object *b* should be an array + of bytes, either :class:`bytes`, :class:`bytearray`, or + :class:`memoryview`. The return value can be less than ``len(b)``, depending on specifics of the underlying raw stream, and especially if it is in non-blocking mode. ``None`` is returned if the raw stream is set not to block and no single byte could be readily - written to it. + written to it. The caller may release or mutate *b* after + this method returns, so the implementation should only access *b* + during the method call. .. class:: BufferedIOBase @@ -465,8 +476,9 @@ I/O Base Classes .. method:: readinto(b) - Read up to len(b) bytes into bytearray *b* and return the number of bytes - read. + Read up to len(b) bytes into *b*, and return the number of bytes read. + The object *b* should be a pre-allocated, writable array of bytes, + either :class:`bytearray` or :class:`memoryview`. Like :meth:`read`, multiple reads may be issued to the underlying raw stream, unless the latter is 'interactive'. @@ -476,9 +488,11 @@ I/O Base Classes .. method:: write(b) - Write the given bytes or bytearray object, *b* and return the number - of bytes written (never less than ``len(b)``, since if the write fails - an :exc:`IOError` will be raised). Depending on the actual + Write *b*, and return the number of bytes written + (always equal to ``len(b)``, since if the write fails + an :exc:`IOError` will be raised). The object *b* should be + an array of bytes, either :class:`bytes`, :class:`bytearray`, + or :class:`memoryview`. Depending on the actual implementation, these bytes may be readily written to the underlying stream, or held in a buffer for performance and latency reasons. @@ -486,6 +500,9 @@ I/O Base Classes data needed to be written to the raw stream but it couldn't accept all the data without blocking. + The caller may release or mutate *b* after this method returns, + so the implementation should only access *b* during the method call. + Raw File I/O ------------ @@ -535,7 +552,8 @@ than raw I/O does. A stream implementation using an in-memory bytes buffer. It inherits :class:`BufferedIOBase`. - The argument *initial_bytes* is an optional initial :class:`bytes`. + The optional argument *initial_bytes* is a :class:`bytes` object that + contains initial data. :class:`BytesIO` provides or overrides these methods in addition to those from :class:`BufferedIOBase` and :class:`IOBase`: @@ -611,8 +629,10 @@ than raw I/O does. .. method:: write(b) - Write the bytes or bytearray object, *b* and return the number of bytes - written. When in non-blocking mode, a :exc:`BlockingIOError` is raised + Write *b*, and return the number of bytes written. + The object *b* should be an array of bytes, either + :class:`bytes`, :class:`bytearray`, or :class:`memoryview`. + When in non-blocking mode, a :exc:`BlockingIOError` is raised if the buffer needs to be written out but the raw stream blocks. |