summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-01-09 20:38:15 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2011-01-09 20:38:15 (GMT)
commita4815caa7ccf21aa994d0e0eec66873072f0e352 (patch)
tree5ccb44937ddfdd59ebae4590d2f4cfc05dcced3d
parenta6c91f5e3b013be1447454b3a479d6fabbf16806 (diff)
downloadcpython-a4815caa7ccf21aa994d0e0eec66873072f0e352.zip
cpython-a4815caa7ccf21aa994d0e0eec66873072f0e352.tar.gz
cpython-a4815caa7ccf21aa994d0e0eec66873072f0e352.tar.bz2
Issue #10872: The repr() of TextIOWrapper objects now includes the mode
if available. (at Georg's request)
-rw-r--r--Lib/_pyio.py13
-rw-r--r--Lib/test/test_io.py5
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_io/textio.c41
4 files changed, 51 insertions, 11 deletions
diff --git a/Lib/_pyio.py b/Lib/_pyio.py
index 2a6e7a8..3c1e805 100644
--- a/Lib/_pyio.py
+++ b/Lib/_pyio.py
@@ -1504,13 +1504,20 @@ class TextIOWrapper(TextIOBase):
# - "chars_..." for integer variables that count decoded characters
def __repr__(self):
+ result = "<_pyio.TextIOWrapper"
try:
name = self.name
except AttributeError:
- return "<_pyio.TextIOWrapper encoding={0!r}>".format(self.encoding)
+ pass
+ else:
+ result += " name={0!r}".format(name)
+ try:
+ mode = self.mode
+ except AttributeError:
+ pass
else:
- return "<_pyio.TextIOWrapper name={0!r} encoding={1!r}>".format(
- name, self.encoding)
+ result += " mode={0!r}".format(mode)
+ return result + " encoding={0!r}>".format(self.encoding)
@property
def encoding(self):
diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py
index ee4e42f..a25d9af 100644
--- a/Lib/test/test_io.py
+++ b/Lib/test/test_io.py
@@ -1717,9 +1717,12 @@ class TextIOWrapperTest(unittest.TestCase):
raw.name = "dummy"
self.assertEqual(repr(t),
"<%s.TextIOWrapper name='dummy' encoding='utf-8'>" % modname)
+ t.mode = "r"
+ self.assertEqual(repr(t),
+ "<%s.TextIOWrapper name='dummy' mode='r' encoding='utf-8'>" % modname)
raw.name = b"dummy"
self.assertEqual(repr(t),
- "<%s.TextIOWrapper name=b'dummy' encoding='utf-8'>" % modname)
+ "<%s.TextIOWrapper name=b'dummy' mode='r' encoding='utf-8'>" % modname)
def test_line_buffering(self):
r = self.BytesIO()
diff --git a/Misc/NEWS b/Misc/NEWS
index 2b2c283..d162c5d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -40,6 +40,9 @@ Core and Builtins
Library
-------
+- Issue #10872: The repr() of TextIOWrapper objects now includes the mode
+ if available.
+
- Issue #10869: Fixed bug where ast.increment_lineno modified the root
node twice.
diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c
index 2559714..73d83a1 100644
--- a/Modules/_io/textio.c
+++ b/Modules/_io/textio.c
@@ -2323,25 +2323,52 @@ textiowrapper_truncate(textio *self, PyObject *args)
static PyObject *
textiowrapper_repr(textio *self)
{
- PyObject *nameobj, *res;
+ PyObject *nameobj, *modeobj, *res, *s;
CHECK_INITIALIZED(self);
+ res = PyUnicode_FromString("<_io.TextIOWrapper");
+ if (res == NULL)
+ return NULL;
nameobj = PyObject_GetAttrString((PyObject *) self, "name");
if (nameobj == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear();
else
- return NULL;
- res = PyUnicode_FromFormat("<_io.TextIOWrapper encoding=%R>",
- self->encoding);
+ goto error;
}
else {
- res = PyUnicode_FromFormat("<_io.TextIOWrapper name=%R encoding=%R>",
- nameobj, self->encoding);
+ s = PyUnicode_FromFormat(" name=%R", nameobj);
Py_DECREF(nameobj);
+ if (s == NULL)
+ goto error;
+ PyUnicode_AppendAndDel(&res, s);
+ if (res == NULL)
+ return NULL;
}
- return res;
+ modeobj = PyObject_GetAttrString((PyObject *) self, "mode");
+ if (modeobj == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_AttributeError))
+ PyErr_Clear();
+ else
+ goto error;
+ }
+ else {
+ s = PyUnicode_FromFormat(" mode=%R", modeobj);
+ Py_DECREF(modeobj);
+ if (s == NULL)
+ goto error;
+ PyUnicode_AppendAndDel(&res, s);
+ if (res == NULL)
+ return NULL;
+ }
+ s = PyUnicode_FromFormat("%U encoding=%R>",
+ res, self->encoding);
+ Py_DECREF(res);
+ return s;
+error:
+ Py_XDECREF(res);
+ return NULL;
}