mirror of
https://github.com/python/cpython.git
synced 2025-08-21 09:21:18 +00:00
#14161: fix the __repr__ of file objects to escape the file name.
This commit is contained in:
parent
f60845b70a
commit
11f8b6872a
3 changed files with 19 additions and 4 deletions
|
@ -89,6 +89,13 @@ class AutoFileTests(unittest.TestCase):
|
||||||
def testRepr(self):
|
def testRepr(self):
|
||||||
# verify repr works
|
# verify repr works
|
||||||
self.assertTrue(repr(self.f).startswith("<open file '" + TESTFN))
|
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):
|
def testErrors(self):
|
||||||
self.f.close()
|
self.f.close()
|
||||||
|
|
|
@ -9,6 +9,8 @@ What's New in Python 2.7.4
|
||||||
Core and Builtins
|
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
|
- Issue #1469629: Allow cycles through an object's __dict__ slot to be
|
||||||
collected. (For example if ``x.__dict__ is x``).
|
collected. (For example if ``x.__dict__ is x``).
|
||||||
|
|
||||||
|
|
|
@ -635,10 +635,11 @@ file_dealloc(PyFileObject *f)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
file_repr(PyFileObject *f)
|
file_repr(PyFileObject *f)
|
||||||
{
|
{
|
||||||
|
PyObject *ret = NULL;
|
||||||
|
PyObject *name = NULL;
|
||||||
if (PyUnicode_Check(f->f_name)) {
|
if (PyUnicode_Check(f->f_name)) {
|
||||||
#ifdef Py_USING_UNICODE
|
#ifdef Py_USING_UNICODE
|
||||||
PyObject *ret = NULL;
|
name = PyUnicode_AsUnicodeEscapeString(f->f_name);
|
||||||
PyObject *name = PyUnicode_AsUnicodeEscapeString(f->f_name);
|
|
||||||
const char *name_str = name ? PyString_AsString(name) : "?";
|
const char *name_str = name ? PyString_AsString(name) : "?";
|
||||||
ret = PyString_FromFormat("<%s file u'%s', mode '%s' at %p>",
|
ret = PyString_FromFormat("<%s file u'%s', mode '%s' at %p>",
|
||||||
f->f_fp == NULL ? "closed" : "open",
|
f->f_fp == NULL ? "closed" : "open",
|
||||||
|
@ -649,11 +650,16 @@ file_repr(PyFileObject *f)
|
||||||
return ret;
|
return ret;
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} 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",
|
f->f_fp == NULL ? "closed" : "open",
|
||||||
PyString_AsString(f->f_name),
|
PyString_AsString(name),
|
||||||
PyString_AsString(f->f_mode),
|
PyString_AsString(f->f_mode),
|
||||||
f);
|
f);
|
||||||
|
Py_XDECREF(name);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue