Commit 733ecdcc authored by R. David Murray's avatar R. David Murray

Merged revisions 78145 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r78145 | r.david.murray | 2010-02-10 21:42:19 -0500 (Wed, 10 Feb 2010) | 18 lines

  Merged revisions 78141-78142 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r78141 | r.david.murray | 2010-02-10 20:38:42 -0500 (Wed, 10 Feb 2010) | 6 lines

    Issue 5754:  tweak shelve doc wording to make it clearer that even when
    writeback=True values are written to the backing store when assigned to
    the shelf.  Add test to confirm that this happens.  Doc patch and added
    test by Robert Lehmann.  I also fixed the cross references to the sync
    and close methods.
  ........
    r78142 | r.david.murray | 2010-02-10 20:56:42 -0500 (Wed, 10 Feb 2010) | 3 lines

    Improve issue 7835 fix per MAL to handle the case that the
    module dictionary has also been cleared.
  ........
................
parent 709b4c35
...@@ -27,14 +27,15 @@ lots of shared sub-objects. The keys are ordinary strings. ...@@ -27,14 +27,15 @@ lots of shared sub-objects. The keys are ordinary strings.
Because of Python semantics, a shelf cannot know when a mutable Because of Python semantics, a shelf cannot know when a mutable
persistent-dictionary entry is modified. By default modified objects are persistent-dictionary entry is modified. By default modified objects are
written only when assigned to the shelf (see :ref:`shelve-example`). If the written *only* when assigned to the shelf (see :ref:`shelve-example`). If the
optional *writeback* parameter is set to *True*, all entries accessed are optional *writeback* parameter is set to *True*, all entries accessed are also
cached in memory, and written back on :meth:`sync` and :meth:`close`; this cached in memory, and written back on :meth:`~Shelf.sync` and
can make it handier to mutate mutable entries in the persistent dictionary, :meth:`~Shelf.close`; this can make it handier to mutate mutable entries in
but, if many entries are accessed, it can consume vast amounts of memory for the persistent dictionary, but, if many entries are accessed, it can consume
the cache, and it can make the close operation very slow since all accessed vast amounts of memory for the cache, and it can make the close operation
entries are written back (there is no way to determine which accessed entries very slow since all accessed entries are written back (there is no way to
are mutable, nor which ones were actually mutated). determine which accessed entries are mutable, nor which ones were actually
mutated).
.. note:: .. note::
......
...@@ -136,11 +136,12 @@ class Shelf(collections.MutableMapping): ...@@ -136,11 +136,12 @@ class Shelf(collections.MutableMapping):
self.dict.close() self.dict.close()
except AttributeError: except AttributeError:
pass pass
# _ClosedDict can be None when close is called from __del__ during shutdown # Catch errors that may happen when close is called from __del__
if _ClosedDict is None: # because CPython is in interpreter shutdown.
self.dict = None try:
else:
self.dict = _ClosedDict() self.dict = _ClosedDict()
except (NameError, TypeError):
self.dict = None
def __del__(self): def __del__(self):
if not hasattr(self, 'writeback'): if not hasattr(self, 'writeback'):
......
...@@ -122,6 +122,19 @@ class TestCase(unittest.TestCase): ...@@ -122,6 +122,19 @@ class TestCase(unittest.TestCase):
self.assertEqual(len(d1), 1) self.assertEqual(len(d1), 1)
self.assertEqual(len(d2), 1) self.assertEqual(len(d2), 1)
def test_writeback_also_writes_immediately(self):
# Issue 5754
d = {}
key = 'key'
encodedkey = key.encode('utf-8')
s = shelve.Shelf(d, writeback=True)
s[key] = [1]
p1 = d[encodedkey] # Will give a KeyError if backing store not updated
s['key'].append(2)
s.close()
p2 = d[encodedkey]
self.assertNotEqual(p1, p2) # Write creates new object in store
from test import mapping_tests from test import mapping_tests
......
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