Commit 732324a3 authored by Georg Brandl's avatar Georg Brandl

#7905: Actually respect the keyencoding parameter to shelve.Shelf.

parent c9fb3c64
...@@ -101,7 +101,7 @@ Restrictions ...@@ -101,7 +101,7 @@ Restrictions
implementation used. implementation used.
.. class:: Shelf(dict, protocol=None, writeback=False) .. class:: Shelf(dict, protocol=None, writeback=False, keyencoding='utf-8')
A subclass of :class:`collections.MutableMapping` which stores pickled values A subclass of :class:`collections.MutableMapping` which stores pickled values
in the *dict* object. in the *dict* object.
...@@ -115,8 +115,15 @@ Restrictions ...@@ -115,8 +115,15 @@ Restrictions
This allows natural operations on mutable entries, but can consume much more This allows natural operations on mutable entries, but can consume much more
memory and make sync and close take a long time. memory and make sync and close take a long time.
The *keyencoding* parameter is the encoding used to encode keys before they
are used with the underlying dict.
.. class:: BsdDbShelf(dict, protocol=None, writeback=False) .. versionadded:: 3.2
The *keyencoding* parameter; previously, keys were always encoded in
UTF-8.
.. class:: BsdDbShelf(dict, protocol=None, writeback=False, keyencoding='utf-8')
A subclass of :class:`Shelf` which exposes :meth:`first`, :meth:`!next`, A subclass of :class:`Shelf` which exposes :meth:`first`, :meth:`!next`,
:meth:`previous`, :meth:`last` and :meth:`set_location` which are available :meth:`previous`, :meth:`last` and :meth:`set_location` which are available
...@@ -125,8 +132,8 @@ Restrictions ...@@ -125,8 +132,8 @@ Restrictions
modules. The *dict* object passed to the constructor must support those modules. The *dict* object passed to the constructor must support those
methods. This is generally accomplished by calling one of methods. This is generally accomplished by calling one of
:func:`bsddb.hashopen`, :func:`bsddb.btopen` or :func:`bsddb.rnopen`. The :func:`bsddb.hashopen`, :func:`bsddb.btopen` or :func:`bsddb.rnopen`. The
optional *protocol* and *writeback* parameters have the same interpretation optional *protocol*, *writeback*, and *keyencoding* parameters have the same
as for the :class:`Shelf` class. interpretation as for the :class:`Shelf` class.
.. class:: DbfilenameShelf(filename, flag='c', protocol=None, writeback=False) .. class:: DbfilenameShelf(filename, flag='c', protocol=None, writeback=False)
......
...@@ -73,6 +73,7 @@ class _ClosedDict(collections.MutableMapping): ...@@ -73,6 +73,7 @@ class _ClosedDict(collections.MutableMapping):
def __repr__(self): def __repr__(self):
return '<Closed Dictionary>' return '<Closed Dictionary>'
class Shelf(collections.MutableMapping): class Shelf(collections.MutableMapping):
"""Base class for shelf implementations. """Base class for shelf implementations.
...@@ -88,7 +89,7 @@ class Shelf(collections.MutableMapping): ...@@ -88,7 +89,7 @@ class Shelf(collections.MutableMapping):
self._protocol = protocol self._protocol = protocol
self.writeback = writeback self.writeback = writeback
self.cache = {} self.cache = {}
self.keyencoding = "utf-8" self.keyencoding = keyencoding
def __iter__(self): def __iter__(self):
for k in self.dict.keys(): for k in self.dict.keys():
......
...@@ -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_keyencoding(self):
d = {}
key = 'Pöp'
# the default keyencoding is utf-8
shelve.Shelf(d)[key] = [1]
self.assertIn(key.encode('utf-8'), d)
# but a different one can be given
shelve.Shelf(d, keyencoding='latin1')[key] = [1]
self.assertIn(key.encode('latin1'), d)
# with all consequences
s = shelve.Shelf(d, keyencoding='ascii')
self.assertRaises(UnicodeEncodeError, s.__setitem__, key, [1])
def test_writeback_also_writes_immediately(self): def test_writeback_also_writes_immediately(self):
# Issue 5754 # Issue 5754
d = {} d = {}
......
...@@ -45,6 +45,8 @@ Core and Builtins ...@@ -45,6 +45,8 @@ Core and Builtins
Library Library
------- -------
- Issue #7905: Actually respect the keyencoding parameter to shelve.Shelf.
- Issue #1569291: Speed up array.repeat(). - Issue #1569291: Speed up array.repeat().
- Provide an interface to set the optimization level of compilation in - Provide an interface to set the optimization level of compilation in
......
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