]> granicus.if.org Git - python/commitdiff
Issue 1592: Better error reporting for operations on closed shelves.
authorRaymond Hettinger <python@rcn.com>
Fri, 25 Jul 2008 18:43:33 +0000 (18:43 +0000)
committerRaymond Hettinger <python@rcn.com>
Fri, 25 Jul 2008 18:43:33 +0000 (18:43 +0000)
Lib/shelve.py
Lib/test/test_shelve.py
Misc/NEWS

index 7a75445b0bf376c17361a2c319b76537a8daf241..2a430f374b7cf8df773dac3cb0988e435ddb4d93 100644 (file)
@@ -73,6 +73,16 @@ import warnings
 
 __all__ = ["Shelf","BsdDbShelf","DbfilenameShelf","open"]
 
+class _ClosedDict(UserDict.DictMixin):
+    'Marker for a closed dict.  Access attempts raise a ValueError.'
+
+    def closed(self, *args):
+        raise ValueError('invalid operation on closed shelf')
+    __getitem__ = __setitem__ = __delitem__ = keys = closed
+
+    def __repr__(self):
+        return '<Closed Dictionary>'
+
 class Shelf(UserDict.DictMixin):
     """Base class for shelf implementations.
 
@@ -136,7 +146,7 @@ class Shelf(UserDict.DictMixin):
             self.dict.close()
         except AttributeError:
             pass
-        self.dict = 0
+        self.dict = _ClosedDict()
 
     def __del__(self):
         if not hasattr(self, 'writeback'):
index ffd2120372e126c7f99df7bcb16b6ebfa8928c54..ffcc98da56e367c79f74d7d296be572b2427098c 100644 (file)
@@ -8,6 +8,21 @@ class TestCase(unittest.TestCase):
 
     fn = "shelftemp" + os.extsep + "db"
 
+    def test_close(self):
+        d1 = {}
+        s = shelve.Shelf(d1, protocol=2, writeback=False)
+        s['key1'] = [1,2,3,4]
+        self.assertEqual(s['key1'], [1,2,3,4])
+        self.assertEqual(len(s), 1)
+        s.close()
+        self.assertRaises(ValueError, len, s)
+        try:
+            s['key1']
+        except ValueError:
+            pass
+        else:
+            self.fail('Closed shelf should not find a key')
+
     def test_ascii_file_shelf(self):
         try:
             s = shelve.open(self.fn, protocol=0)
index 53c680d694dbdc1a65562b06beb4d25deeb20fc2..87ef02d3256b40e55ae7be229078aec60ba71200 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -26,6 +26,9 @@ Core and Builtins
 Library
 -------
 
+- Issue 1592:  Improve error reporting when operations are attempted
+  on a closed shelf.
+
 - Deprecate the "ast" parser function aliases.
 
 - Issue #3120: On 64-bit Windows the subprocess module was truncating handles.