Commit 9a94a6ac authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #10872: The repr() of TextIOWrapper objects now includes the mode

if available.

(at Georg's request)
parent 4275186c
...@@ -1504,13 +1504,20 @@ class TextIOWrapper(TextIOBase): ...@@ -1504,13 +1504,20 @@ class TextIOWrapper(TextIOBase):
# - "chars_..." for integer variables that count decoded characters # - "chars_..." for integer variables that count decoded characters
def __repr__(self): def __repr__(self):
result = "<_pyio.TextIOWrapper"
try: try:
name = self.name name = self.name
except AttributeError: 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: else:
return "<_pyio.TextIOWrapper name={0!r} encoding={1!r}>".format( result += " mode={0!r}".format(mode)
name, self.encoding) return result + " encoding={0!r}>".format(self.encoding)
@property @property
def encoding(self): def encoding(self):
......
...@@ -1717,9 +1717,12 @@ class TextIOWrapperTest(unittest.TestCase): ...@@ -1717,9 +1717,12 @@ class TextIOWrapperTest(unittest.TestCase):
raw.name = "dummy" raw.name = "dummy"
self.assertEqual(repr(t), self.assertEqual(repr(t),
"<%s.TextIOWrapper name='dummy' encoding='utf-8'>" % modname) "<%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" raw.name = b"dummy"
self.assertEqual(repr(t), 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): def test_line_buffering(self):
r = self.BytesIO() r = self.BytesIO()
......
...@@ -40,6 +40,9 @@ Core and Builtins ...@@ -40,6 +40,9 @@ Core and Builtins
Library 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 - Issue #10869: Fixed bug where ast.increment_lineno modified the root
node twice. node twice.
......
...@@ -2323,25 +2323,52 @@ textiowrapper_truncate(textio *self, PyObject *args) ...@@ -2323,25 +2323,52 @@ textiowrapper_truncate(textio *self, PyObject *args)
static PyObject * static PyObject *
textiowrapper_repr(textio *self) textiowrapper_repr(textio *self)
{ {
PyObject *nameobj, *res; PyObject *nameobj, *modeobj, *res, *s;
CHECK_INITIALIZED(self); CHECK_INITIALIZED(self);
res = PyUnicode_FromString("<_io.TextIOWrapper");
if (res == NULL)
return NULL;
nameobj = PyObject_GetAttrString((PyObject *) self, "name"); nameobj = PyObject_GetAttrString((PyObject *) self, "name");
if (nameobj == NULL) { if (nameobj == NULL) {
if (PyErr_ExceptionMatches(PyExc_AttributeError)) if (PyErr_ExceptionMatches(PyExc_AttributeError))
PyErr_Clear(); PyErr_Clear();
else else
return NULL; goto error;
res = PyUnicode_FromFormat("<_io.TextIOWrapper encoding=%R>",
self->encoding);
} }
else { else {
res = PyUnicode_FromFormat("<_io.TextIOWrapper name=%R encoding=%R>", s = PyUnicode_FromFormat(" name=%R", nameobj);
nameobj, self->encoding);
Py_DECREF(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;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment