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

if available.

(at Georg's request)
This commit is contained in:
Antoine Pitrou 2011-01-09 20:38:15 +00:00
parent a6c91f5e3b
commit a4815caa7c
4 changed files with 51 additions and 11 deletions

View File

@ -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:
return "<_pyio.TextIOWrapper name={0!r} encoding={1!r}>".format(
name, self.encoding)
result += " name={0!r}".format(name)
try:
mode = self.mode
except AttributeError:
pass
else:
result += " mode={0!r}".format(mode)
return result + " encoding={0!r}>".format(self.encoding)
@property
def encoding(self):

View File

@ -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()

View File

@ -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.

View File

@ -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;
}