(original) (raw)

changeset: 79507:3c1df1ede882 user: Andrew Svetlov andrew.svetlov@gmail.com date: Sat Oct 06 13:52:19 2012 +0300 files: Lib/shelve.py Lib/test/test_shelve.py Misc/NEWS description: Issue #13896: Make shelf instances work with 'with' as context managers. Original patch by Filip GruszczyƄski. diff -r 31f8c2df89d8 -r 3c1df1ede882 Lib/shelve.py --- a/Lib/shelve.py Sat Oct 06 13:44:12 2012 +0300 +++ b/Lib/shelve.py Sat Oct 06 13:52:19 2012 +0300 @@ -131,6 +131,12 @@ except KeyError: pass + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + self.close() + def close(self): self.sync() try: @@ -147,6 +153,7 @@ def __del__(self): if not hasattr(self, 'writeback'): # __init__ didn't succeed, so don't bother closing + # see http://bugs.python.org/issue1339007 for details return self.close() diff -r 31f8c2df89d8 -r 3c1df1ede882 Lib/test/test_shelve.py --- a/Lib/test/test_shelve.py Sat Oct 06 13:44:12 2012 +0300 +++ b/Lib/test/test_shelve.py Sat Oct 06 13:52:19 2012 +0300 @@ -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 diff -r 31f8c2df89d8 -r 3c1df1ede882 Misc/NEWS --- a/Misc/NEWS Sat Oct 06 13:44:12 2012 +0300 +++ b/Misc/NEWS Sat Oct 06 13:52:19 2012 +0300 @@ -39,6 +39,9 @@ Library ------- +- Issue #13896: Make shelf instances work with 'with' as context managers. + Original patch by Filip GruszczyƄski. + - Issue #15417: Add support for csh and fish in venv activation scripts. - Issue #16123: IDLE - deprecate running without a subprocess. /andrew.svetlov@gmail.com