diff -r 279b6d778663 Lib/shelve.py --- a/Lib/shelve.py Sat Jan 28 11:37:42 2012 +0100 +++ b/Lib/shelve.py Sat Jan 28 12:12:09 2012 +0100 @@ -130,6 +130,14 @@ del self.cache[key] except KeyError: pass + + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + if not hasattr(self, 'writeback'): + return + self.close() def close(self): self.sync() diff -r 279b6d778663 Lib/test/test_shelve.py --- a/Lib/test/test_shelve.py Sat Jan 28 11:37:42 2012 +0100 +++ b/Lib/test/test_shelve.py Sat Jan 28 12:12:09 2012 +0100 @@ -148,6 +148,19 @@ p2 = d[encodedkey] self.assertNotEqual(p1, p2) # Write creates new object in store + def test_with(self): + d1 = {} + with shelve.Shelf(d1, protocol=2, writeback=False) as s: + s['key1'] = [1,2,3,4] + self.assertEqual(s['key1'], [1,2,3,4]) + self.assertEqual(len(s), 1) + self.assertRaises(ValueError, len, s) + try: + s['key1'] + except ValueError: + pass + else: + self.fail('Closed shelf should not find a key') from test import mapping_tests