[Python-checkins] r65233 - in python/trunk: Lib/shelve.py Lib/test/test_shelve.py Misc/NEWS

raymond.hettinger python-checkins at python.org
Fri Jul 25 20:43:33 CEST 2008


Author: raymond.hettinger
Date: Fri Jul 25 20:43:33 2008
New Revision: 65233

Log:
Issue 1592:  Better error reporting for operations on closed shelves.

Modified:
   python/trunk/Lib/shelve.py
   python/trunk/Lib/test/test_shelve.py
   python/trunk/Misc/NEWS

Modified: python/trunk/Lib/shelve.py
==============================================================================
--- python/trunk/Lib/shelve.py	(original)
+++ python/trunk/Lib/shelve.py	Fri Jul 25 20:43:33 2008
@@ -73,6 +73,16 @@
 
 __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 @@
             self.dict.close()
         except AttributeError:
             pass
-        self.dict = 0
+        self.dict = _ClosedDict()
 
     def __del__(self):
         if not hasattr(self, 'writeback'):

Modified: python/trunk/Lib/test/test_shelve.py
==============================================================================
--- python/trunk/Lib/test/test_shelve.py	(original)
+++ python/trunk/Lib/test/test_shelve.py	Fri Jul 25 20:43:33 2008
@@ -8,6 +8,21 @@
 
     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)

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Fri Jul 25 20:43:33 2008
@@ -26,6 +26,9 @@
 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.


More information about the Python-checkins mailing list