Kaydet (Commit) 8c664e86 authored tarafından Raymond Hettinger's avatar Raymond Hettinger

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

üst 4982d5d0
...@@ -73,6 +73,16 @@ import warnings ...@@ -73,6 +73,16 @@ import warnings
__all__ = ["Shelf","BsdDbShelf","DbfilenameShelf","open"] __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): class Shelf(UserDict.DictMixin):
"""Base class for shelf implementations. """Base class for shelf implementations.
...@@ -136,7 +146,7 @@ class Shelf(UserDict.DictMixin): ...@@ -136,7 +146,7 @@ class Shelf(UserDict.DictMixin):
self.dict.close() self.dict.close()
except AttributeError: except AttributeError:
pass pass
self.dict = 0 self.dict = _ClosedDict()
def __del__(self): def __del__(self):
if not hasattr(self, 'writeback'): if not hasattr(self, 'writeback'):
......
...@@ -8,6 +8,21 @@ class TestCase(unittest.TestCase): ...@@ -8,6 +8,21 @@ class TestCase(unittest.TestCase):
fn = "shelftemp" + os.extsep + "db" 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): def test_ascii_file_shelf(self):
try: try:
s = shelve.open(self.fn, protocol=0) s = shelve.open(self.fn, protocol=0)
......
...@@ -26,6 +26,9 @@ Core and Builtins ...@@ -26,6 +26,9 @@ Core and Builtins
Library Library
------- -------
- Issue 1592: Improve error reporting when operations are attempted
on a closed shelf.
- Deprecate the "ast" parser function aliases. - Deprecate the "ast" parser function aliases.
- Issue #3120: On 64-bit Windows the subprocess module was truncating handles. - Issue #3120: On 64-bit Windows the subprocess module was truncating handles.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment