[Python-checkins] r87024 - in python/branches/py3k: Doc/library/shelve.rst Lib/shelve.py Lib/test/test_shelve.py Misc/NEWS
georg.brandl
python-checkins at python.org
Sat Dec 4 12:12:44 CET 2010
Author: georg.brandl
Date: Sat Dec 4 12:12:43 2010
New Revision: 87024
Log:
#7905: Actually respect the keyencoding parameter to shelve.Shelf.
Modified:
python/branches/py3k/Doc/library/shelve.rst
python/branches/py3k/Lib/shelve.py
python/branches/py3k/Lib/test/test_shelve.py
python/branches/py3k/Misc/NEWS
Modified: python/branches/py3k/Doc/library/shelve.rst
==============================================================================
--- python/branches/py3k/Doc/library/shelve.rst (original)
+++ python/branches/py3k/Doc/library/shelve.rst Sat Dec 4 12:12:43 2010
@@ -101,7 +101,7 @@
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
in the *dict* object.
@@ -115,8 +115,15 @@
This allows natural operations on mutable entries, but can consume much more
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`,
:meth:`previous`, :meth:`last` and :meth:`set_location` which are available
@@ -125,8 +132,8 @@
modules. The *dict* object passed to the constructor must support those
methods. This is generally accomplished by calling one of
:func:`bsddb.hashopen`, :func:`bsddb.btopen` or :func:`bsddb.rnopen`. The
- optional *protocol* and *writeback* parameters have the same interpretation
- as for the :class:`Shelf` class.
+ optional *protocol*, *writeback*, and *keyencoding* parameters have the same
+ interpretation as for the :class:`Shelf` class.
.. class:: DbfilenameShelf(filename, flag='c', protocol=None, writeback=False)
Modified: python/branches/py3k/Lib/shelve.py
==============================================================================
--- python/branches/py3k/Lib/shelve.py (original)
+++ python/branches/py3k/Lib/shelve.py Sat Dec 4 12:12:43 2010
@@ -73,6 +73,7 @@
def __repr__(self):
return '<Closed Dictionary>'
+
class Shelf(collections.MutableMapping):
"""Base class for shelf implementations.
@@ -88,7 +89,7 @@
self._protocol = protocol
self.writeback = writeback
self.cache = {}
- self.keyencoding = "utf-8"
+ self.keyencoding = keyencoding
def __iter__(self):
for k in self.dict.keys():
Modified: python/branches/py3k/Lib/test/test_shelve.py
==============================================================================
--- python/branches/py3k/Lib/test/test_shelve.py (original)
+++ python/branches/py3k/Lib/test/test_shelve.py Sat Dec 4 12:12:43 2010
@@ -122,6 +122,19 @@
self.assertEqual(len(d1), 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):
# Issue 5754
d = {}
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Sat Dec 4 12:12:43 2010
@@ -45,6 +45,8 @@
Library
-------
+- Issue #7905: Actually respect the keyencoding parameter to shelve.Shelf.
+
- Issue #1569291: Speed up array.repeat().
- Provide an interface to set the optimization level of compilation in
More information about the Python-checkins
mailing list