#2067: file.__exit__() now calls subclasses' close() method.

This commit is contained in:
Georg Brandl 2008-02-23 15:11:18 +00:00
parent 7e251e83d5
commit ad61bc8d9b
3 changed files with 22 additions and 4 deletions

View File

@ -322,12 +322,28 @@ class OtherFileTests(unittest.TestCase):
finally:
os.unlink(TESTFN)
class FileSubclassTests(unittest.TestCase):
def testExit(self):
# test that exiting with context calls subclass' close
class C(file):
def __init__(self, *args):
self.subclass_closed = False
file.__init__(self, *args)
def close(self):
self.subclass_closed = True
file.close(self)
with C(TESTFN, 'w') as f:
pass
self.failUnless(f.subclass_closed)
def test_main():
# Historically, these tests have been sloppy about removing TESTFN.
# So get rid of it no matter what.
try:
run_unittest(AutoFileTests, OtherFileTests)
run_unittest(AutoFileTests, OtherFileTests, FileSubclassTests)
finally:
if os.path.exists(TESTFN):
os.unlink(TESTFN)

View File

@ -12,7 +12,9 @@ What's New in Python 2.6 alpha 1?
Core and builtins
-----------------
- Patch #1759: Backport of PEP 3129 class decorators
- Issue #2067: file.__exit__() now calls subclasses' close() method.
- Patch #1759: Backport of PEP 3129 class decorators.
- Issue #1881: An internal parser limit has been increased. Also see
issue 215555 for a discussion.

View File

@ -1660,9 +1660,9 @@ file_self(PyFileObject *f)
}
static PyObject *
file_exit(PyFileObject *f, PyObject *args)
file_exit(PyObject *f, PyObject *args)
{
PyObject *ret = file_close(f);
PyObject *ret = PyObject_CallMethod(f, "close", NULL);
if (!ret)
/* If error occurred, pass through */
return NULL;