#14161: fix the __repr__ of file objects to escape the file name.
This commit is contained in:
parent
f60845b70a
commit
11f8b6872a
|
@ -89,6 +89,13 @@ class AutoFileTests(unittest.TestCase):
|
|||
def testRepr(self):
|
||||
# verify repr works
|
||||
self.assertTrue(repr(self.f).startswith("<open file '" + TESTFN))
|
||||
# see issue #14161
|
||||
# Windows doesn't like \r\n\t" in the file name, but ' is ok
|
||||
fname = 'xx\rxx\nxx\'xx"xx' if sys.platform != "win32" else "xx'xx"
|
||||
with open(fname, 'w') as f:
|
||||
self.addCleanup(os.remove, fname)
|
||||
self.assertTrue(repr(f).startswith(
|
||||
"<open file %r, mode 'w' at" % fname))
|
||||
|
||||
def testErrors(self):
|
||||
self.f.close()
|
||||
|
|
|
@ -9,6 +9,8 @@ What's New in Python 2.7.4
|
|||
Core and Builtins
|
||||
-----------------
|
||||
|
||||
- Issue #14161: fix the __repr__ of file objects to escape the file name.
|
||||
|
||||
- Issue #1469629: Allow cycles through an object's __dict__ slot to be
|
||||
collected. (For example if ``x.__dict__ is x``).
|
||||
|
||||
|
|
|
@ -635,10 +635,11 @@ file_dealloc(PyFileObject *f)
|
|||
static PyObject *
|
||||
file_repr(PyFileObject *f)
|
||||
{
|
||||
PyObject *ret = NULL;
|
||||
PyObject *name = NULL;
|
||||
if (PyUnicode_Check(f->f_name)) {
|
||||
#ifdef Py_USING_UNICODE
|
||||
PyObject *ret = NULL;
|
||||
PyObject *name = PyUnicode_AsUnicodeEscapeString(f->f_name);
|
||||
name = PyUnicode_AsUnicodeEscapeString(f->f_name);
|
||||
const char *name_str = name ? PyString_AsString(name) : "?";
|
||||
ret = PyString_FromFormat("<%s file u'%s', mode '%s' at %p>",
|
||||
f->f_fp == NULL ? "closed" : "open",
|
||||
|
@ -649,11 +650,16 @@ file_repr(PyFileObject *f)
|
|||
return ret;
|
||||
#endif
|
||||
} else {
|
||||
return PyString_FromFormat("<%s file '%s', mode '%s' at %p>",
|
||||
name = PyObject_Repr(f->f_name);
|
||||
if (name == NULL)
|
||||
return NULL;
|
||||
ret = PyString_FromFormat("<%s file %s, mode '%s' at %p>",
|
||||
f->f_fp == NULL ? "closed" : "open",
|
||||
PyString_AsString(f->f_name),
|
||||
PyString_AsString(name),
|
||||
PyString_AsString(f->f_mode),
|
||||
f);
|
||||
Py_XDECREF(name);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue