mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
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
4 changed files with 51 additions and 11 deletions
13
Lib/_pyio.py
13
Lib/_pyio.py
|
@ -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:
|
else:
|
||||||
return "<_pyio.TextIOWrapper name={0!r} encoding={1!r}>".format(
|
result += " name={0!r}".format(name)
|
||||||
name, self.encoding)
|
try:
|
||||||
|
mode = self.mode
|
||||||
|
except AttributeError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
result += " mode={0!r}".format(mode)
|
||||||
|
return result + " encoding={0!r}>".format(self.encoding)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def encoding(self):
|
def encoding(self):
|
||||||
|
|
|
@ -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
|
||||||
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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue