Issue #10872: The repr() of TextIOWrapper objects now includes the mode
if available. (at Georg's request)
This commit is contained in:
parent
a6c91f5e3b
commit
a4815caa7c
13
Lib/_pyio.py
13
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:
|
||||
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):
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue