]> granicus.if.org Git - python/commitdiff
Issue #13896: Make shelf instances work with 'with' as context managers.
authorAndrew Svetlov <andrew.svetlov@gmail.com>
Sat, 6 Oct 2012 10:52:19 +0000 (13:52 +0300)
committerAndrew Svetlov <andrew.svetlov@gmail.com>
Sat, 6 Oct 2012 10:52:19 +0000 (13:52 +0300)
Original patch by Filip GruszczyƄski.

Lib/shelve.py
Lib/test/test_shelve.py
Misc/NEWS

index cc1815e3eb881ad66d7cfecb000bbeac72d8e1ea..cfb6863d0435e7c53ea69c91f193ecef14bd185f 100644 (file)
@@ -131,6 +131,12 @@ class Shelf(collections.MutableMapping):
         except KeyError:
             pass
 
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, traceback):
+        self.close()
+
     def close(self):
         self.sync()
         try:
@@ -147,6 +153,7 @@ class Shelf(collections.MutableMapping):
     def __del__(self):
         if not hasattr(self, 'writeback'):
             # __init__ didn't succeed, so don't bother closing
+            # see http://bugs.python.org/issue1339007 for details
             return
         self.close()
 
index 13c126566d62c73d04fdeed92d05127e99929764..bd51d868fee3baaf83d1729e8544075fe7b146b4 100644 (file)
@@ -148,6 +148,19 @@ class TestCase(unittest.TestCase):
         p2 = d[encodedkey]
         self.assertNotEqual(p1, p2)  # Write creates new object in store
 
+    def test_with(self):
+        d1 = {}
+        with shelve.Shelf(d1, protocol=2, writeback=False) as s:
+            s['key1'] = [1,2,3,4]
+            self.assertEqual(s['key1'], [1,2,3,4])
+            self.assertEqual(len(s), 1)
+        self.assertRaises(ValueError, len, s)
+        try:
+            s['key1']
+        except ValueError:
+            pass
+        else:
+            self.fail('Closed shelf should not find a key')
 
 from test import mapping_tests
 
index c52149e909a7510733742569518e761c6adf9bbd..c0b55f603fe20fd4b89f5a406498ed324a803023 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -39,6 +39,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #13896: Make shelf instances work with 'with' as context managers.
+  Original patch by Filip GruszczyƄski.
+
 - Issue #15417: Add support for csh and fish in venv activation scripts.
 
 - Issue #16123: IDLE - deprecate running without a subprocess.