]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-34204: Use pickle.DEFAULT_PROTOCOL in shelve (GH-19639)
authorZackery Spytz <zspytz@gmail.com>
Thu, 29 Oct 2020 09:44:35 +0000 (03:44 -0600)
committerGitHub <noreply@github.com>
Thu, 29 Oct 2020 09:44:35 +0000 (02:44 -0700)
Use pickle.DEFAULT_PROTOCOL (currently 5) in shelve instead of a
hardcoded 3.

Doc/library/shelve.rst
Doc/whatsnew/3.10.rst
Lib/shelve.py
Lib/test/test_shelve.py
Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst [new file with mode: 0644]

index f08c58179a2f9f071371b4e7bf8217bc47f569ef..07caf91d5b7d994dd8dccdb118b41a2e7d66d4fb 100644 (file)
@@ -25,8 +25,9 @@ lots of shared  sub-objects.  The keys are ordinary strings.
    database file is opened for reading and writing.  The optional *flag* parameter
    has the same interpretation as the *flag* parameter of :func:`dbm.open`.
 
-   By default, version 3 pickles are used to serialize values.  The version of the
-   pickle protocol can be specified with the *protocol* parameter.
+   By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used
+   to serialize values.  The version of the pickle protocol can be specified
+   with the *protocol* parameter.
 
    Because of Python semantics, a shelf cannot know when a mutable
    persistent-dictionary entry is modified.  By default modified objects are
@@ -40,6 +41,10 @@ lots of shared  sub-objects.  The keys are ordinary strings.
    determine which accessed entries are mutable, nor which ones were actually
    mutated).
 
+   .. versionchanged:: 3.10
+      :data:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle
+      protocol.
+
    .. note::
 
       Do not rely on the shelf being closed automatically; always call
@@ -108,9 +113,10 @@ Restrictions
    A subclass of :class:`collections.abc.MutableMapping` which stores pickled
    values in the *dict* object.
 
-   By default, version 3 pickles are used to serialize values.  The version of the
-   pickle protocol can be specified with the *protocol* parameter. See the
-   :mod:`pickle` documentation for a discussion of the pickle protocols.
+   By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used
+   to serialize values.  The version of the pickle protocol can be specified
+   with the *protocol* parameter.  See the :mod:`pickle` documentation for a
+   discussion of the pickle protocols.
 
    If the *writeback* parameter is ``True``, the object will hold a cache of all
    entries accessed and write them back to the *dict* at sync and close times.
@@ -130,6 +136,10 @@ Restrictions
    .. versionchanged:: 3.4
       Added context manager support.
 
+   .. versionchanged:: 3.10
+      :data:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle
+      protocol.
+
 
 .. class:: BsdDbShelf(dict, protocol=None, writeback=False, keyencoding='utf-8')
 
index b2c6d10ba8deb720d19917267d115ee5a5022a5b..45258db4925718dd2682e87c27f19da01f78ad0b 100644 (file)
@@ -210,6 +210,13 @@ py_compile
 Added ``--quiet`` option to command-line interface of :mod:`py_compile`.
 (Contributed by Gregory Schevchenko in :issue:`38731`.)
 
+shelve
+------
+
+The :mod:`shelve` module now uses :data:`pickle.DEFAULT_PROTOCOL` by default
+instead of :mod:`pickle` protocol ``3`` when creating shelves.
+(Contributed by Zackery Spytz in :issue:`34204`.)
+
 sys
 ---
 
index 5d443a0fa8d4f14c56b1ca2497a621f0d02683d7..e053c397345a07e69dfa8f72a3d5ebbede86a883 100644 (file)
@@ -56,7 +56,7 @@ entries in the cache, and empty the cache (d.sync() also synchronizes
 the persistent dictionary on disk, if feasible).
 """
 
-from pickle import Pickler, Unpickler
+from pickle import DEFAULT_PROTOCOL, Pickler, Unpickler
 from io import BytesIO
 
 import collections.abc
@@ -85,7 +85,7 @@ class Shelf(collections.abc.MutableMapping):
                  keyencoding="utf-8"):
         self.dict = dict
         if protocol is None:
-            protocol = 3
+            protocol = DEFAULT_PROTOCOL
         self._protocol = protocol
         self.writeback = writeback
         self.cache = {}
index ac25eee2e52fd92ee368c8b57cd887250d46b2d0..cfdd67c26c5f51fcc35659d83c5bef847f17c4d6 100644 (file)
@@ -1,6 +1,8 @@
 import unittest
 import shelve
 import glob
+import pickle
+
 from test import support
 from test.support import os_helper
 from collections.abc import MutableMapping
@@ -160,7 +162,7 @@ class TestCase(unittest.TestCase):
 
     def test_default_protocol(self):
         with shelve.Shelf({}) as s:
-            self.assertEqual(s._protocol, 3)
+            self.assertEqual(s._protocol, pickle.DEFAULT_PROTOCOL)
 
 from test import mapping_tests
 
diff --git a/Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst b/Misc/NEWS.d/next/Library/2020-04-21-17-18-33.bpo-34204.9wXTtY.rst
new file mode 100644 (file)
index 0000000..bce6d39
--- /dev/null
@@ -0,0 +1,2 @@
+The :mod:`shelve` module now uses :data:`pickle.DEFAULT_PROTOCOL` by default
+instead of :mod:`pickle` protocol ``3``.