bpo-34204: Use pickle.DEFAULT_PROTOCOL in shelve (GH-19639)

Use pickle.DEFAULT_PROTOCOL (currently 5) in shelve instead of a
hardcoded 3.
This commit is contained in:
Zackery Spytz 2020-10-29 03:44:35 -06:00 committed by GitHub
parent 4173320920
commit df59273c7a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 29 additions and 8 deletions

View 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 database file is opened for reading and writing. The optional *flag* parameter
has the same interpretation as the *flag* parameter of :func:`dbm.open`. 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 By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used
pickle protocol can be specified with the *protocol* parameter. 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 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
@ -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 determine which accessed entries are mutable, nor which ones were actually
mutated). mutated).
.. versionchanged:: 3.10
:data:`pickle.DEFAULT_PROTOCOL` is now used as the default pickle
protocol.
.. note:: .. note::
Do not rely on the shelf being closed automatically; always call 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 A subclass of :class:`collections.abc.MutableMapping` which stores pickled
values in the *dict* object. values in the *dict* object.
By default, version 3 pickles are used to serialize values. The version of the By default, pickles created with :data:`pickle.DEFAULT_PROTOCOL` are used
pickle protocol can be specified with the *protocol* parameter. See the to serialize values. The version of the pickle protocol can be specified
:mod:`pickle` documentation for a discussion of the pickle protocols. 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 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. entries accessed and write them back to the *dict* at sync and close times.
@ -130,6 +136,10 @@ Restrictions
.. versionchanged:: 3.4 .. versionchanged:: 3.4
Added context manager support. 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') .. class:: BsdDbShelf(dict, protocol=None, writeback=False, keyencoding='utf-8')

View File

@ -210,6 +210,13 @@ py_compile
Added ``--quiet`` option to command-line interface of :mod:`py_compile`. Added ``--quiet`` option to command-line interface of :mod:`py_compile`.
(Contributed by Gregory Schevchenko in :issue:`38731`.) (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 sys
--- ---

View File

@ -56,7 +56,7 @@ entries in the cache, and empty the cache (d.sync() also synchronizes
the persistent dictionary on disk, if feasible). the persistent dictionary on disk, if feasible).
""" """
from pickle import Pickler, Unpickler from pickle import DEFAULT_PROTOCOL, Pickler, Unpickler
from io import BytesIO from io import BytesIO
import collections.abc import collections.abc
@ -85,7 +85,7 @@ class Shelf(collections.abc.MutableMapping):
keyencoding="utf-8"): keyencoding="utf-8"):
self.dict = dict self.dict = dict
if protocol is None: if protocol is None:
protocol = 3 protocol = DEFAULT_PROTOCOL
self._protocol = protocol self._protocol = protocol
self.writeback = writeback self.writeback = writeback
self.cache = {} self.cache = {}

View File

@ -1,6 +1,8 @@
import unittest import unittest
import shelve import shelve
import glob import glob
import pickle
from test import support from test import support
from test.support import os_helper from test.support import os_helper
from collections.abc import MutableMapping from collections.abc import MutableMapping
@ -160,7 +162,7 @@ class TestCase(unittest.TestCase):
def test_default_protocol(self): def test_default_protocol(self):
with shelve.Shelf({}) as s: with shelve.Shelf({}) as s:
self.assertEqual(s._protocol, 3) self.assertEqual(s._protocol, pickle.DEFAULT_PROTOCOL)
from test import mapping_tests from test import mapping_tests

View File

@ -0,0 +1,2 @@
The :mod:`shelve` module now uses :data:`pickle.DEFAULT_PROTOCOL` by default
instead of :mod:`pickle` protocol ``3``.