__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.
self.dict.close()
except AttributeError:
pass
- self.dict = 0
+ self.dict = _ClosedDict()
def __del__(self):
if not hasattr(self, 'writeback'):
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)
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.