mirror of
https://github.com/python/cpython.git
synced 2025-07-29 14:15:07 +00:00
Issue 1592: Better error reporting for operations on closed shelves.
This commit is contained in:
parent
4982d5d04a
commit
8c664e8628
3 changed files with 29 additions and 1 deletions
|
@ -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):
|
||||||
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):
|
||||||
|
|
||||||
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
|
||||||
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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue