Index: Lib/_pyio.py =================================================================== --- Lib/_pyio.py (révision 72863) +++ Lib/_pyio.py (copie de travail) @@ -736,6 +736,15 @@ def mode(self): return self.raw.mode + def __repr__(self): + clsname = self.__class__.__name__ + try: + name = self.name + except AttributeError: + return "<_pyio.{0}>".format(clsname) + else: + return "<_pyio.{0} name={1!r}>".format(clsname, name) + ### Lower-level APIs ### def fileno(self): @@ -1455,7 +1464,13 @@ # - "chars_..." for integer variables that count decoded characters def __repr__(self): - return "".format(self.encoding) + try: + name = self.name + except AttributeError: + return "<_pyio.TextIOWrapper encoding={0!r}>".format(self.encoding) + else: + return "<_pyio.TextIOWrapper name={0!r} encoding={1!r}>".format( + name, self.encoding) @property def encoding(self): Index: Lib/test/test_io.py =================================================================== --- Lib/test/test_io.py (révision 72863) +++ Lib/test/test_io.py (copie de travail) @@ -618,7 +618,17 @@ self.assert_(s.startswith("Exception IOError: "), s) self.assert_(s.endswith(" ignored"), s) + def test_repr(self): + raw = self.MockRawIO() + b = self.tp(raw) + clsname = "%s.%s" % (self.tp.__module__, self.tp.__name__) + self.assertEqual(repr(b), "<%s>" % clsname) + raw.name = "dummy" + self.assertEqual(repr(b), "<%s name='dummy'>" % clsname) + raw.name = b"dummy" + self.assertEqual(repr(b), "<%s name=b'dummy'>" % clsname) + class BufferedReaderTest(unittest.TestCase, CommonBufferedTests): read_mode = "rb" @@ -1528,7 +1538,15 @@ raw = self.BytesIO("hello".encode("utf-8")) b = self.BufferedReader(raw) t = self.TextIOWrapper(b, encoding="utf-8") - self.assertEqual(repr(t), "") + modname = self.TextIOWrapper.__module__ + self.assertEqual(repr(t), + "<%s.TextIOWrapper encoding='utf-8'>" % modname) + raw.name = "dummy" + self.assertEqual(repr(t), + "<%s.TextIOWrapper name='dummy' encoding='utf-8'>" % modname) + raw.name = b"dummy" + self.assertEqual(repr(t), + "<%s.TextIOWrapper name=b'dummy' encoding='utf-8'>" % modname) def test_line_buffering(self): r = self.BytesIO() Index: Lib/test/test_fileio.py =================================================================== --- Lib/test/test_fileio.py (révision 72863) +++ Lib/test/test_fileio.py (copie de travail) @@ -71,8 +71,10 @@ def testRepr(self): self.assertEquals(repr(self.f), - "io.FileIO(%d, %s)" % (self.f.fileno(), - repr(self.f.mode))) + "io.FileIO(%r, %r)" % (self.f.name, self.f.mode)) + del self.f.name + self.assertEquals(repr(self.f), + "io.FileIO(%r, %r)" % (self.f.fileno(), self.f.mode)) def testErrors(self): f = self.f Index: Modules/_io/fileio.c =================================================================== --- Modules/_io/fileio.c (révision 72863) +++ Modules/_io/fileio.c (copie de travail) @@ -846,11 +846,23 @@ static PyObject * fileio_repr(PyFileIOObject *self) { + PyObject *nameobj, *res; + if (self->fd < 0) return PyUnicode_FromFormat("io.FileIO(-1)"); - return PyUnicode_FromFormat("io.FileIO(%d, '%s')", - self->fd, mode_string(self)); + nameobj = PyObject_GetAttrString((PyObject *) self, "name"); + if (nameobj == NULL) { + PyErr_Clear(); + res = PyUnicode_FromFormat("io.FileIO(%d, '%s')", + self->fd, mode_string(self)); + } + else { + res = PyUnicode_FromFormat("io.FileIO(%R, '%s')", + nameobj, mode_string(self)); + Py_DECREF(nameobj); + } + return res; } static PyObject * Index: Modules/_io/bufferedio.c =================================================================== --- Modules/_io/bufferedio.c (révision 72863) +++ Modules/_io/bufferedio.c (copie de travail) @@ -1123,6 +1123,24 @@ return line; } +static PyObject * +Buffered_repr(BufferedObject *self) +{ + PyObject *nameobj, *res; + + nameobj = PyObject_GetAttrString((PyObject *) self, "name"); + if (nameobj == NULL) { + PyErr_Clear(); + res = PyUnicode_FromFormat("<%s>", Py_TYPE(self)->tp_name); + } + else { + res = PyUnicode_FromFormat("<%s name=%R>", + Py_TYPE(self)->tp_name, nameobj); + Py_DECREF(nameobj); + } + return res; +} + /* * class BufferedReader */ @@ -1472,7 +1490,7 @@ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare */ - 0, /*tp_repr*/ + (reprfunc)Buffered_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ @@ -1828,7 +1846,7 @@ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare */ - 0, /*tp_repr*/ + (reprfunc)Buffered_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ @@ -2219,7 +2237,7 @@ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare */ - 0, /*tp_repr*/ + (reprfunc)Buffered_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ Index: Modules/_io/textio.c =================================================================== --- Modules/_io/textio.c (révision 72863) +++ Modules/_io/textio.c (copie de travail) @@ -2308,8 +2308,22 @@ static PyObject * TextIOWrapper_repr(PyTextIOWrapperObject *self) { - CHECK_INITIALIZED(self); - return PyUnicode_FromFormat("", self->encoding); + PyObject *nameobj, *res; + + CHECK_INITIALIZED(self); + + nameobj = PyObject_GetAttrString((PyObject *) self, "name"); + if (nameobj == NULL) { + PyErr_Clear(); + res = PyUnicode_FromFormat("<_io.TextIOWrapper encoding=%R>", + self->encoding); + } + else { + res = PyUnicode_FromFormat("<_io.TextIOWrapper name=%R encoding=%R>", + nameobj, self->encoding); + Py_DECREF(nameobj); + } + return res; }