[Python-checkins] cpython (2.7): Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO

antoine.pitrou python-checkins at python.org
Wed Sep 5 20:20:54 CEST 2012


http://hg.python.org/cpython/rev/d0ab34d4c733
changeset: 78854:d0ab34d4c733
branch: 2.7
parent: 78826:2370e331241b
user: Antoine Pitrou <solipsis at pitrou.net>
date: Wed Sep 05 20:11:49 2012 +0200
summary:
 Issue #15841: The readable(), writable() and seekable() methods of io.BytesIO
and io.StringIO objects now raise ValueError when the object has been closed.
Patch by Alessandro Moura.
files:
 Lib/_pyio.py | 8 ++++++++
 Lib/test/test_memoryio.py | 7 +++----
 Misc/ACKS | 1 +
 Misc/NEWS | 4 ++++
 Modules/_io/bytesio.c | 20 +++++++++++++++-----
 Modules/_io/stringio.c | 19 ++++++++++++++++---
 6 files changed, 47 insertions(+), 12 deletions(-)
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -883,12 +883,18 @@
 return pos
 
 def readable(self):
+ if self.closed:
+ raise ValueError("I/O operation on closed file.")
 return True
 
 def writable(self):
+ if self.closed:
+ raise ValueError("I/O operation on closed file.")
 return True
 
 def seekable(self):
+ if self.closed:
+ raise ValueError("I/O operation on closed file.")
 return True
 
 
@@ -1546,6 +1552,8 @@
 return self._buffer
 
 def seekable(self):
+ if self.closed:
+ raise ValueError("I/O operation on closed file.")
 return self._seekable
 
 def readable(self):
diff --git a/Lib/test/test_memoryio.py b/Lib/test/test_memoryio.py
--- a/Lib/test/test_memoryio.py
+++ b/Lib/test/test_memoryio.py
@@ -328,9 +328,9 @@
 self.assertEqual(memio.isatty(), False)
 self.assertEqual(memio.closed, False)
 memio.close()
- self.assertEqual(memio.writable(), True)
- self.assertEqual(memio.readable(), True)
- self.assertEqual(memio.seekable(), True)
+ self.assertRaises(ValueError, memio.writable)
+ self.assertRaises(ValueError, memio.readable)
+ self.assertRaises(ValueError, memio.seekable)
 self.assertRaises(ValueError, memio.isatty)
 self.assertEqual(memio.closed, True)
 
@@ -649,7 +649,6 @@
 check(io.BytesIO(b'a'), basesize + 1 + 1 )
 check(io.BytesIO(b'a' * 1000), basesize + 1000 + 1 )
 
-
 class CStringIOTest(PyStringIOTest):
 ioclass = io.StringIO
 UnsupportedOperation = io.UnsupportedOperation
diff --git a/Misc/ACKS b/Misc/ACKS
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -602,6 +602,7 @@
 Paul Moore
 Derek Morr
 James A Morrison
+Alessandro Moura
 Pablo Mouzo
 Ruslan Mstoi
 Sjoerd Mullender
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -98,6 +98,10 @@
 Library
 -------
 
+- Issue #15841: The readable(), writable() and seekable() methods of
+ io.BytesIO and io.StringIO objects now raise ValueError when the object has
+ been closed. Patch by Alessandro Moura.
+
 - Issue #12776,#11839: call argparse type function (specified by add_argument)
 only once. Before, the type function was called twice in the case where the
 default was specified and the argument was given as well. This was
diff --git a/Modules/_io/bytesio.c b/Modules/_io/bytesio.c
--- a/Modules/_io/bytesio.c
+++ b/Modules/_io/bytesio.c
@@ -106,7 +106,7 @@
 }
 
 /* Internal routine for writing a string of bytes to the buffer of a BytesIO
- object. Returns the number of bytes wrote, or -1 on error. */
+ object. Returns the number of bytes written, or -1 on error. */
 static Py_ssize_t
 write_bytes(bytesio *self, const char *bytes, Py_ssize_t len)
 {
@@ -156,10 +156,20 @@
 }
 }
 
+PyDoc_STRVAR(readable_doc,
+"readable() -> bool. Returns True if the IO object can be read.");
+
+PyDoc_STRVAR(writable_doc,
+"writable() -> bool. Returns True if the IO object can be written.");
+
+PyDoc_STRVAR(seekable_doc,
+"seekable() -> bool. Returns True if the IO object can be seeked.");
+
 /* Generic getter for the writable, readable and seekable properties */
 static PyObject *
-return_true(bytesio *self)
+return_not_closed(bytesio *self)
 {
+ CHECK_CLOSED(self);
 Py_RETURN_TRUE;
 }
 
@@ -827,9 +837,9 @@
 };
 
 static struct PyMethodDef bytesio_methods[] = {
- {"readable", (PyCFunction)return_true, METH_NOARGS, NULL},
- {"seekable", (PyCFunction)return_true, METH_NOARGS, NULL},
- {"writable", (PyCFunction)return_true, METH_NOARGS, NULL},
+ {"readable", (PyCFunction)return_not_closed, METH_NOARGS, readable_doc},
+ {"seekable", (PyCFunction)return_not_closed, METH_NOARGS, seekable_doc},
+ {"writable", (PyCFunction)return_not_closed, METH_NOARGS, writable_doc},
 {"close", (PyCFunction)bytesio_close, METH_NOARGS, close_doc},
 {"flush", (PyCFunction)bytesio_flush, METH_NOARGS, flush_doc},
 {"isatty", (PyCFunction)bytesio_isatty, METH_NOARGS, isatty_doc},
diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c
--- a/Modules/_io/stringio.c
+++ b/Modules/_io/stringio.c
@@ -632,10 +632,21 @@
 }
 
 /* Properties and pseudo-properties */
+
+PyDoc_STRVAR(stringio_readable_doc,
+"readable() -> bool. Returns True if the IO object can be read.");
+
+PyDoc_STRVAR(stringio_writable_doc,
+"writable() -> bool. Returns True if the IO object can be written.");
+
+PyDoc_STRVAR(stringio_seekable_doc,
+"seekable() -> bool. Returns True if the IO object can be seeked.");
+
 static PyObject *
 stringio_seekable(stringio *self, PyObject *args)
 {
 CHECK_INITIALIZED(self);
+ CHECK_CLOSED(self);
 Py_RETURN_TRUE;
 }
 
@@ -643,6 +654,7 @@
 stringio_readable(stringio *self, PyObject *args)
 {
 CHECK_INITIALIZED(self);
+ CHECK_CLOSED(self);
 Py_RETURN_TRUE;
 }
 
@@ -650,6 +662,7 @@
 stringio_writable(stringio *self, PyObject *args)
 {
 CHECK_INITIALIZED(self);
+ CHECK_CLOSED(self);
 Py_RETURN_TRUE;
 }
 
@@ -817,9 +830,9 @@
 {"seek", (PyCFunction)stringio_seek, METH_VARARGS, stringio_seek_doc},
 {"write", (PyCFunction)stringio_write, METH_O, stringio_write_doc},
 
- {"seekable", (PyCFunction)stringio_seekable, METH_NOARGS},
- {"readable", (PyCFunction)stringio_readable, METH_NOARGS},
- {"writable", (PyCFunction)stringio_writable, METH_NOARGS},
+ {"seekable", (PyCFunction)stringio_seekable, METH_NOARGS, stringio_seekable_doc},
+ {"readable", (PyCFunction)stringio_readable, METH_NOARGS, stringio_readable_doc},
+ {"writable", (PyCFunction)stringio_writable, METH_NOARGS, stringio_writable_doc},
 
 {"__getstate__", (PyCFunction)stringio_getstate, METH_NOARGS},
 {"__setstate__", (PyCFunction)stringio_setstate, METH_O},
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /