summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/shelve.py12
-rw-r--r--Lib/test/test_shelve.py15
-rw-r--r--Misc/NEWS3
3 files changed, 29 insertions, 1 deletions
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 @@ 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'):
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 @@ 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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 53c680d..87ef02d 100644
--- 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.