[Python-checkins] r76809 - in python/branches/release31-maint: Lib/test/test_fileio.py Lib/test/test_io.py Misc/NEWS Modules/_io/_iomodule.c Modules/_io/_iomodule.h Modules/_io/bufferedio.c Modules/_io/fileio.c Modules/_io/iobase.c Modules/_io/textio.c
benjamin.peterson
python-checkins at python.org
Sun Dec 13 20:30:15 CET 2009
Author: benjamin.peterson
Date: Sun Dec 13 20:30:15 2009
New Revision: 76809
Log:
Merged revisions 76806,76808 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
................
r76806 | benjamin.peterson | 2009-12-13 13:25:34 -0600 (Sun, 13 Dec 2009) | 14 lines
Merged revisions 76805 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r76805 | benjamin.peterson | 2009-12-13 13:19:07 -0600 (Sun, 13 Dec 2009) | 7 lines
accept None as the same as having passed no argument in file types #7349
This is for consistency with imitation file objects like StringIO and BytesIO.
This commit also adds a few tests, where they were lacking for concerned
methods.
........
................
r76808 | benjamin.peterson | 2009-12-13 13:28:09 -0600 (Sun, 13 Dec 2009) | 9 lines
Merged revisions 76807 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r76807 | benjamin.peterson | 2009-12-13 13:27:02 -0600 (Sun, 13 Dec 2009) | 1 line
remove unused variable
........
................
Modified:
python/branches/release31-maint/ (props changed)
python/branches/release31-maint/Lib/test/test_fileio.py
python/branches/release31-maint/Lib/test/test_io.py
python/branches/release31-maint/Misc/NEWS
python/branches/release31-maint/Modules/_io/_iomodule.c
python/branches/release31-maint/Modules/_io/_iomodule.h
python/branches/release31-maint/Modules/_io/bufferedio.c
python/branches/release31-maint/Modules/_io/fileio.c
python/branches/release31-maint/Modules/_io/iobase.c
python/branches/release31-maint/Modules/_io/textio.c
Modified: python/branches/release31-maint/Lib/test/test_fileio.py
==============================================================================
--- python/branches/release31-maint/Lib/test/test_fileio.py (original)
+++ python/branches/release31-maint/Lib/test/test_fileio.py Sun Dec 13 20:30:15 2009
@@ -69,6 +69,15 @@
n = self.f.readinto(a)
self.assertEquals(array('b', [1, 2]), a[:n])
+ def test_none_args(self):
+ self.f.write(b"hi\nbye\nabc")
+ self.f.close()
+ self.f = _FileIO(TESTFN, 'r')
+ self.assertEqual(self.f.read(None), b"hi\nbye\nabc")
+ self.f.seek(0)
+ self.assertEqual(self.f.readline(None), b"hi\n")
+ self.assertEqual(self.f.readlines(None), [b"bye\n", b"abc"])
+
def testRepr(self):
self.assertEquals(repr(self.f), "<_io.FileIO name=%r mode=%r>"
% (self.f.name, self.f.mode))
Modified: python/branches/release31-maint/Lib/test/test_io.py
==============================================================================
--- python/branches/release31-maint/Lib/test/test_io.py (original)
+++ python/branches/release31-maint/Lib/test/test_io.py Sun Dec 13 20:30:15 2009
@@ -336,7 +336,7 @@
self.assertEqual(f.readline(2), b"xy")
self.assertEqual(f.readline(4), b"zzy\n")
self.assertEqual(f.readline(), b"foo\x00bar\n")
- self.assertEqual(f.readline(), b"another line")
+ self.assertEqual(f.readline(None), b"another line")
self.assertRaises(TypeError, f.readline, 5.3)
with self.open(support.TESTFN, "r") as f:
self.assertRaises(TypeError, f.readline, 5.3)
@@ -647,9 +647,10 @@
self.assertEquals(b"abc", bufio.read())
def test_read(self):
- rawio = self.MockRawIO((b"abc", b"d", b"efg"))
- bufio = self.tp(rawio)
- self.assertEquals(b"abcdef", bufio.read(6))
+ for arg in (None, 7):
+ rawio = self.MockRawIO((b"abc", b"d", b"efg"))
+ bufio = self.tp(rawio)
+ self.assertEquals(b"abcdefg", bufio.read(arg))
# Invalid args
self.assertRaises(ValueError, bufio.read, -2)
@@ -666,6 +667,7 @@
self.assertEquals(b"efg", bufio.read1(100))
self.assertEquals(rawio._reads, 3)
self.assertEquals(b"", bufio.read1(100))
+ self.assertEquals(rawio._reads, 4)
# Invalid args
self.assertRaises(ValueError, bufio.read1, -1)
@@ -684,6 +686,14 @@
self.assertEquals(bufio.readinto(b), 0)
self.assertEquals(b, b"gf")
+ def test_readlines(self):
+ def bufio():
+ rawio = self.MockRawIO((b"abc\n", b"d\n", b"ef"))
+ return self.tp(rawio)
+ self.assertEquals(bufio().readlines(), [b"abc\n", b"d\n", b"ef"])
+ self.assertEquals(bufio().readlines(5), [b"abc\n", b"d\n"])
+ self.assertEquals(bufio().readlines(None), [b"abc\n", b"d\n", b"ef"])
+
def test_buffering(self):
data = b"abcdefghi"
dlen = len(data)
@@ -1123,6 +1133,14 @@
self.assertEqual(pair.read(3), b"abc")
self.assertEqual(pair.read(1), b"d")
self.assertEqual(pair.read(), b"ef")
+ pair = self.tp(self.BytesIO(b"abc"), self.MockRawIO())
+ self.assertEqual(pair.read(None), b"abc")
+
+ def test_readlines(self):
+ pair = lambda: self.tp(self.BytesIO(b"abc\ndef\nh"), self.MockRawIO())
+ self.assertEqual(pair().readlines(), [b"abc\n", b"def\n", b"h"])
+ self.assertEqual(pair().readlines(), [b"abc\n", b"def\n", b"h"])
+ self.assertEqual(pair().readlines(5), [b"abc\n", b"def\n"])
def test_read1(self):
# .read1() is delegated to the underlying reader object, so this test
@@ -1773,6 +1791,8 @@
self.assertEquals(f.read(), "abc")
cookie = f.tell()
self.assertEquals(f.seek(0), 0)
+ self.assertEquals(f.read(None), "abc")
+ f.seek(0)
self.assertEquals(f.read(2), "ab")
self.assertEquals(f.read(1), "c")
self.assertEquals(f.read(1), "")
@@ -1943,6 +1963,14 @@
reads += c
self.assertEquals(reads, "AA\nBB")
+ def test_readlines(self):
+ txt = self.TextIOWrapper(self.BytesIO(b"AA\nBB\nCC"))
+ self.assertEqual(txt.readlines(), ["AA\n", "BB\n", "CC"])
+ txt.seek(0)
+ self.assertEqual(txt.readlines(None), ["AA\n", "BB\n", "CC"])
+ txt.seek(0)
+ self.assertEqual(txt.readlines(5), ["AA\n", "BB\n"])
+
# read in amounts equal to TextIOWrapper._CHUNK_SIZE which is 128.
def test_read_by_chunk(self):
# make sure "\r\n" straddles 128 char boundary.
Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS (original)
+++ python/branches/release31-maint/Misc/NEWS Sun Dec 13 20:30:15 2009
@@ -58,6 +58,10 @@
Library
-------
+- Issue #7349: Make methods of file objects in the io module accept None as an
+ argument where file-like objects (ie StringIO and BytesIO) accept them to mean
+ the same as passing no argument.
+
- Issue #5949: added check for correct lineends in input from IMAP server
in imaplib.
Modified: python/branches/release31-maint/Modules/_io/_iomodule.c
==============================================================================
--- python/branches/release31-maint/Modules/_io/_iomodule.c (original)
+++ python/branches/release31-maint/Modules/_io/_iomodule.c Sun Dec 13 20:30:15 2009
@@ -561,6 +561,30 @@
return result;
}
+
+/* Basically the "n" format code with the ability to turn None into -1. */
+int
+_PyIO_ConvertSsize_t(PyObject *obj, void *result) {
+ Py_ssize_t limit;
+ if (obj == Py_None) {
+ limit = -1;
+ }
+ else if (PyNumber_Check(obj)) {
+ limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);
+ if (limit == -1 && PyErr_Occurred())
+ return 0;
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "integer argument expected, got '%.200s'",
+ Py_TYPE(obj)->tp_name);
+ return 0;
+ }
+ *((Py_ssize_t *)result) = limit;
+ return 1;
+}
+
+
static int
iomodule_traverse(PyObject *mod, visitproc visit, void *arg) {
_PyIO_State *state = IO_MOD_STATE(mod);
@@ -574,6 +598,7 @@
return 0;
}
+
static int
iomodule_clear(PyObject *mod) {
_PyIO_State *state = IO_MOD_STATE(mod);
@@ -591,6 +616,7 @@
iomodule_clear(mod);
}
+
/*
* Module definition
*/
Modified: python/branches/release31-maint/Modules/_io/_iomodule.h
==============================================================================
--- python/branches/release31-maint/Modules/_io/_iomodule.h (original)
+++ python/branches/release31-maint/Modules/_io/_iomodule.h Sun Dec 13 20:30:15 2009
@@ -19,6 +19,9 @@
extern PyTypeObject PyTextIOWrapper_Type;
extern PyTypeObject PyIncrementalNewlineDecoder_Type;
+
+extern int _PyIO_ConvertSsize_t(PyObject *, void *);
+
/* These functions are used as METH_NOARGS methods, are normally called
* with args=NULL, and return a new reference.
* BUT when args=Py_True is passed, they return a borrowed reference.
Modified: python/branches/release31-maint/Modules/_io/bufferedio.c
==============================================================================
--- python/branches/release31-maint/Modules/_io/bufferedio.c (original)
+++ python/branches/release31-maint/Modules/_io/bufferedio.c Sun Dec 13 20:30:15 2009
@@ -716,7 +716,7 @@
PyObject *res;
CHECK_INITIALIZED(self)
- if (!PyArg_ParseTuple(args, "|n:read", &n)) {
+ if (!PyArg_ParseTuple(args, "|O&:read", &_PyIO_ConvertSsize_t, &n)) {
return NULL;
}
if (n < -1) {
@@ -949,10 +949,8 @@
Py_ssize_t limit = -1;
CHECK_INITIALIZED(self)
-
- if (!PyArg_ParseTuple(args, "|n:readline", &limit)) {
+ if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit))
return NULL;
- }
return _buffered_readline(self, limit);
}
Modified: python/branches/release31-maint/Modules/_io/fileio.c
==============================================================================
--- python/branches/release31-maint/Modules/_io/fileio.c (original)
+++ python/branches/release31-maint/Modules/_io/fileio.c Sun Dec 13 20:30:15 2009
@@ -602,7 +602,7 @@
if (!self->readable)
return err_mode("reading");
- if (!PyArg_ParseTuple(args, "|n", &size))
+ if (!PyArg_ParseTuple(args, "|O&", &_PyIO_ConvertSsize_t, &size))
return NULL;
if (size < 0) {
Modified: python/branches/release31-maint/Modules/_io/iobase.c
==============================================================================
--- python/branches/release31-maint/Modules/_io/iobase.c (original)
+++ python/branches/release31-maint/Modules/_io/iobase.c Sun Dec 13 20:30:15 2009
@@ -455,7 +455,7 @@
PyObject *buffer, *result;
Py_ssize_t old_size = -1;
- if (!PyArg_ParseTuple(args, "|n:readline", &limit)) {
+ if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) {
return NULL;
}
@@ -577,16 +577,11 @@
iobase_readlines(PyObject *self, PyObject *args)
{
Py_ssize_t hint = -1, length = 0;
- PyObject *hintobj = Py_None, *result;
+ PyObject *result;
- if (!PyArg_ParseTuple(args, "|O:readlines", &hintobj)) {
+ if (!PyArg_ParseTuple(args, "|O&:readlines", &_PyIO_ConvertSsize_t, &hint)) {
return NULL;
}
- if (hintobj != Py_None) {
- hint = PyNumber_AsSsize_t(hintobj, PyExc_ValueError);
- if (hint == -1 && PyErr_Occurred())
- return NULL;
- }
result = PyList_New(0);
if (result == NULL)
Modified: python/branches/release31-maint/Modules/_io/textio.c
==============================================================================
--- python/branches/release31-maint/Modules/_io/textio.c (original)
+++ python/branches/release31-maint/Modules/_io/textio.c Sun Dec 13 20:30:15 2009
@@ -1479,7 +1479,7 @@
CHECK_INITIALIZED(self);
- if (!PyArg_ParseTuple(args, "|n:read", &n))
+ if (!PyArg_ParseTuple(args, "|O&:read", &_PyIO_ConvertSsize_t, &n))
return NULL;
CHECK_CLOSED(self);
More information about the Python-checkins
mailing list