Issue 1592:  Better error reporting for operations on closed shelves.
diff --git a/Lib/shelve.py b/Lib/shelve.py
index 7a75445..2a430f3 100644
--- a/Lib/shelve.py
+++ b/Lib/shelve.py
@@ -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'):
diff --git a/Lib/test/test_shelve.py b/Lib/test/test_shelve.py
index ffd2120..ffcc98d 100644
--- a/Lib/test/test_shelve.py
+++ b/Lib/test/test_shelve.py
@@ -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)