]> granicus.if.org Git - python/commitdiff
Fix test_mailbox by supporting context manager protocol for get_file() returns.
authorGeorg Brandl <georg@python.org>
Sat, 30 Oct 2010 14:33:28 +0000 (14:33 +0000)
committerGeorg Brandl <georg@python.org>
Sat, 30 Oct 2010 14:33:28 +0000 (14:33 +0000)
Doc/library/mailbox.rst
Lib/mailbox.py
Misc/NEWS

index b041d94953cbedc09a6aa7990076a532294e66cc..da01791f70e130c3cee14260adbce9e37a3547d5 100644 (file)
@@ -180,15 +180,19 @@ Maildir, mbox, MH, Babyl, and MMDF.
    .. method:: get_file(key)
 
       Return a file-like representation of the message corresponding to *key*,
-      or raise a :exc:`KeyError` exception if no such message exists. The
-      file-like object behaves as if open in binary mode. This file should be
+      or raise a :exc:`KeyError` exception if no such message exists.  The
+      file-like object behaves as if open in binary mode.  This file should be
       closed once it is no longer needed.
 
+      .. versionadded:: 3.2
+         The file-like object supports the context manager protocol, so that
+         you can use a :keyword:`with` statement to automatically close it.
+
       .. note::
 
          Unlike other representations of messages, file-like representations are
          not necessarily independent of the :class:`Mailbox` instance that
-         created them or of the underlying mailbox. More specific documentation
+         created them or of the underlying mailbox.  More specific documentation
          is provided by each subclass.
 
 
index e6f17353362fffaa99efa17d8bfe8bf1bcf8de0d..520463a86939d1392b102d1f248c28b8bd4cb586 100644 (file)
@@ -1827,6 +1827,8 @@ class _ProxyFile:
 
     def close(self):
         """Close the file."""
+        if hasattr(self._file, 'close'):
+            self._file.close()
         del self._file
 
     def _read(self, size, read_method):
@@ -1838,6 +1840,13 @@ class _ProxyFile:
         self._pos = self._file.tell()
         return result
 
+    def __enter__(self):
+        """Context manager protocol support."""
+        return self
+
+    def __exit__(self, *exc):
+        self.close()
+
 
 class _PartialFile(_ProxyFile):
     """A read-only wrapper of part of a file."""
@@ -1871,6 +1880,11 @@ class _PartialFile(_ProxyFile):
             size = remaining
         return _ProxyFile._read(self, size, read_method)
 
+    def close(self):
+        # do *not* close the underlying file object for partial files,
+        # since it's global to the mailbox object
+        del self._file
+
 
 def _lock_file(f, dotlock=True):
     """Lock file f using lockf and dot locking."""
index afbf04c04b322fc2e7d3cf16b849e2c78718efbc..827640a5d48529c378a16a7614f7d07cbc19c49d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -57,6 +57,9 @@ Core and Builtins
 Library
 -------
 
+- Support context manager protocol for file-like objects returned by
+  mailbox ``get_file()`` methods.
+
 - Issue #10246: uu.encode didn't close file objects explicitly when filenames
   were given to it.  Patch by Brian Brazil.