Skip to content

gh-118830: Bump DEFAULT_PROTOCOL to 5 (#118830) #119340

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions Doc/library/pickle.rst
Original file line number Diff line number Diff line change
Expand Up @@ -156,13 +156,14 @@ to read the pickle produced.

* Protocol version 4 was added in Python 3.4. It adds support for very large
objects, pickling more kinds of objects, and some data format
optimizations. It is the default protocol starting with Python 3.8.
optimizations. This was the default protocol in Python 3.8--3.13.
Refer to :pep:`3154` for information about improvements brought by
protocol 4.

* Protocol version 5 was added in Python 3.8. It adds support for out-of-band
data and speedup for in-band data. Refer to :pep:`574` for information about
improvements brought by protocol 5.
data and speedup for in-band data. It is the default protocol starting with
Python 3.14. Refer to :pep:`574` for information about improvements brought
by protocol 5.

.. note::
Serialization is a more primitive notion than persistence; although
Expand Down Expand Up @@ -199,8 +200,10 @@ The :mod:`pickle` module provides the following constants:

An integer, the default :ref:`protocol version <pickle-protocols>` used
for pickling. May be less than :data:`HIGHEST_PROTOCOL`. Currently the
default protocol is 4, first introduced in Python 3.4 and incompatible
with previous versions.
default protocol is 5, introduced in Python 3.8 and incompatible
with previous versions. This version introduces support for out-of-band
buffers, where :pep:`3118`-compatible data can be transmitted separately
from the main pickle stream.

.. versionchanged:: 3.0

Expand All @@ -210,6 +213,10 @@ The :mod:`pickle` module provides the following constants:

The default protocol is 4.

.. versionchanged:: 3.14

The default protocol is 5.

The :mod:`pickle` module provides the following functions to make the pickling
process more convenient:

Expand Down
7 changes: 6 additions & 1 deletion Doc/whatsnew/3.14.rst
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,12 @@ symtable

(Contributed by Bénédikt Tran in :gh:`120029`.)

pickle
------

* Set the default protocol version on the :mod:`pickle` module to 5.
For more details, please see :ref:`pickle protocols <pickle-protocols>`.


Optimizations
=============
Expand All @@ -135,7 +141,6 @@ asyncio




Deprecated
==========

Expand Down
6 changes: 3 additions & 3 deletions Lib/pickle.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
bytes_types = (bytes, bytearray)

# These are purely informational; no code uses these.
format_version = "4.0" # File format version we write
format_version = "5.0" # File format version we write
compatible_formats = ["1.0", # Original protocol 0
"1.1", # Protocol 0 with INST added
"1.2", # Original protocol 1
Expand All @@ -68,7 +68,7 @@
# The protocol we write by default. May be less than HIGHEST_PROTOCOL.
# Only bump this if the oldest still supported version of Python already
# includes it.
DEFAULT_PROTOCOL = 4
DEFAULT_PROTOCOL = 5

class PickleError(Exception):
"""A common base class for the other pickling exceptions."""
Expand Down Expand Up @@ -408,7 +408,7 @@ def __init__(self, file, protocol=None, *, fix_imports=True,

The optional *protocol* argument tells the pickler to use the
given protocol; supported protocols are 0, 1, 2, 3, 4 and 5.
The default protocol is 4. It was introduced in Python 3.4, and
The default protocol is 5. It was introduced in Python 3.8, and
is incompatible with previous versions.

Specifying a negative protocol version selects the highest
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Bump :mod:`pickle` default protocol to ``5``.
14 changes: 7 additions & 7 deletions Modules/_pickle.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class _pickle.UnpicklerMemoProxy "UnpicklerMemoProxyObject *" ""
already includes it. */
enum {
HIGHEST_PROTOCOL = 5,
DEFAULT_PROTOCOL = 4
DEFAULT_PROTOCOL = 5
};

#ifdef MS_WINDOWS
Expand Down Expand Up @@ -4692,7 +4692,7 @@ This takes a binary file for writing a pickle data stream.

The optional *protocol* argument tells the pickler to use the given
protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default
protocol is 4. It was introduced in Python 3.4, and is incompatible
protocol is 5. It was introduced in Python 3.8, and is incompatible
with previous versions.

Specifying a negative protocol version selects the highest protocol
Expand Down Expand Up @@ -4725,7 +4725,7 @@ static int
_pickle_Pickler___init___impl(PicklerObject *self, PyObject *file,
PyObject *protocol, int fix_imports,
PyObject *buffer_callback)
/*[clinic end generated code: output=0abedc50590d259b input=a7c969699bf5dad3]*/
/*[clinic end generated code: output=0abedc50590d259b input=cddc50f66b770002]*/
{
/* In case of multiple __init__() calls, clear previous content. */
if (self->write != NULL)
Expand Down Expand Up @@ -7507,7 +7507,7 @@ be more efficient.

The optional *protocol* argument tells the pickler to use the given
protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default
protocol is 4. It was introduced in Python 3.4, and is incompatible
protocol is 5. It was introduced in Python 3.8, and is incompatible
with previous versions.

Specifying a negative protocol version selects the highest protocol
Expand All @@ -7533,7 +7533,7 @@ static PyObject *
_pickle_dump_impl(PyObject *module, PyObject *obj, PyObject *file,
PyObject *protocol, int fix_imports,
PyObject *buffer_callback)
/*[clinic end generated code: output=706186dba996490c input=5ed6653da99cd97c]*/
/*[clinic end generated code: output=706186dba996490c input=b89ce8d0e911fd46]*/
{
PickleState *state = _Pickle_GetState(module);
PicklerObject *pickler = _Pickler_New(state);
Expand Down Expand Up @@ -7578,7 +7578,7 @@ Return the pickled representation of the object as a bytes object.

The optional *protocol* argument tells the pickler to use the given
protocol; supported protocols are 0, 1, 2, 3, 4 and 5. The default
protocol is 4. It was introduced in Python 3.4, and is incompatible
protocol is 5. It was introduced in Python 3.8, and is incompatible
with previous versions.

Specifying a negative protocol version selects the highest protocol
Expand All @@ -7598,7 +7598,7 @@ into *file* as part of the pickle stream. It is an error if
static PyObject *
_pickle_dumps_impl(PyObject *module, PyObject *obj, PyObject *protocol,
int fix_imports, PyObject *buffer_callback)
/*[clinic end generated code: output=fbab0093a5580fdf input=e543272436c6f987]*/
/*[clinic end generated code: output=fbab0093a5580fdf input=139fc546886c63ac]*/
{
PyObject *result;
PickleState *state = _Pickle_GetState(module);
Expand Down
8 changes: 4 additions & 4 deletions Modules/clinic/_pickle.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading