diff options
| author | Antoine Pitrou <solipsis@pitrou.net> | 2009-01-10 16:22:51 +0000 | 
|---|---|---|
| committer | Antoine Pitrou <solipsis@pitrou.net> | 2009-01-10 16:22:51 +0000 | 
| commit | 308705e4fab1fe784218bde5cc8c8d2daddf6700 (patch) | |
| tree | c179157d874086e0e6472b292287e1eb3e7806c0 /Lib | |
| parent | ab868311a5282f188a8cf831b021938420fee5c4 (diff) | |
| download | cpython-git-308705e4fab1fe784218bde5cc8c8d2daddf6700.tar.gz | |
Merged revisions 68484-68485 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r68484 | antoine.pitrou | 2009-01-10 17:13:45 +0100 (sam., 10 janv. 2009) | 3 lines
  Issue #3860: GzipFile and BZ2File now support the context manager protocol.
........
  r68485 | antoine.pitrou | 2009-01-10 17:15:24 +0100 (sam., 10 janv. 2009) | 1 line
  Add NEWS entry for r68484.
........
Diffstat (limited to 'Lib')
| -rw-r--r-- | Lib/gzip.py | 8 | ||||
| -rw-r--r-- | Lib/test/test_bz2.py | 22 | ||||
| -rw-r--r-- | Lib/test/test_gzip.py | 22 | 
3 files changed, 51 insertions, 1 deletions
diff --git a/Lib/gzip.py b/Lib/gzip.py index 560a722bae..019c3e2df1 100644 --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -472,6 +472,14 @@ class GzipFile:          else:              raise StopIteration +    def __enter__(self): +        if self.fileobj is None: +            raise ValueError("I/O operation on closed GzipFile object") +        return self + +    def __exit__(self, *args): +        self.close() +  def _test():      # Act like gzip; with -d, act like gunzip. diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py index 366ab7a16f..18d84bb60e 100644 --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -258,6 +258,28 @@ class BZ2FileTest(BaseTest):          bz2f.close()          self.assertEqual(xlines, [b'Test']) +    def testContextProtocol(self): +        # BZ2File supports the context management protocol +        f = None +        with BZ2File(self.filename, "wb") as f: +            f.write(b"xxx") +        f = BZ2File(self.filename, "rb") +        f.close() +        try: +            with f: +                pass +        except ValueError: +            pass +        else: +            self.fail("__enter__ on a closed file didn't raise an exception") +        try: +            with BZ2File(self.filename, "wb") as f: +                1/0 +        except ZeroDivisionError: +            pass +        else: +            self.fail("1/0 didn't raise an exception") +  class BZ2CompressorTest(BaseTest):      def testCompress(self): diff --git a/Lib/test/test_gzip.py b/Lib/test/test_gzip.py index e758826fa7..baf3a21f87 100644 --- a/Lib/test/test_gzip.py +++ b/Lib/test/test_gzip.py @@ -166,7 +166,6 @@ class TestGzip(unittest.TestCase):          fWrite = gzip.GzipFile(self.filename, 'w', mtime = mtime)          fWrite.write(data1)          fWrite.close() -          fRead = gzip.GzipFile(self.filename)          dataRead = fRead.read()          self.assertEqual(dataRead, data1) @@ -223,6 +222,27 @@ class TestGzip(unittest.TestCase):          fRead.close() +    def test_with_open(self): +        # GzipFile supports the context management protocol +        with gzip.GzipFile(self.filename, "wb") as f: +            f.write(b"xxx") +        f = gzip.GzipFile(self.filename, "rb") +        f.close() +        try: +            with f: +                pass +        except ValueError: +            pass +        else: +            self.fail("__enter__ on a closed file didn't raise an exception") +        try: +            with gzip.GzipFile(self.filename, "wb") as f: +                1/0 +        except ZeroDivisionError: +            pass +        else: +            self.fail("1/0 didn't raise an exception") +  def test_main(verbose=None):      support.run_unittest(TestGzip)  | 
