17db96d56Sopenharmony_ci:mod:`pickle` --- Python object serialization 27db96d56Sopenharmony_ci============================================= 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci.. module:: pickle 57db96d56Sopenharmony_ci :synopsis: Convert Python objects to streams of bytes and back. 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ci.. sectionauthor:: Jim Kerr <jbkerr@sr.hp.com>. 87db96d56Sopenharmony_ci.. sectionauthor:: Barry Warsaw <barry@python.org> 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci**Source code:** :source:`Lib/pickle.py` 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci.. index:: 137db96d56Sopenharmony_ci single: persistence 147db96d56Sopenharmony_ci pair: persistent; objects 157db96d56Sopenharmony_ci pair: serializing; objects 167db96d56Sopenharmony_ci pair: marshalling; objects 177db96d56Sopenharmony_ci pair: flattening; objects 187db96d56Sopenharmony_ci pair: pickling; objects 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci-------------- 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ciThe :mod:`pickle` module implements binary protocols for serializing and 237db96d56Sopenharmony_cide-serializing a Python object structure. *"Pickling"* is the process 247db96d56Sopenharmony_ciwhereby a Python object hierarchy is converted into a byte stream, and 257db96d56Sopenharmony_ci*"unpickling"* is the inverse operation, whereby a byte stream 267db96d56Sopenharmony_ci(from a :term:`binary file` or :term:`bytes-like object`) is converted 277db96d56Sopenharmony_ciback into an object hierarchy. Pickling (and unpickling) is alternatively 287db96d56Sopenharmony_ciknown as "serialization", "marshalling," [#]_ or "flattening"; however, to 297db96d56Sopenharmony_ciavoid confusion, the terms used here are "pickling" and "unpickling". 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci.. warning:: 327db96d56Sopenharmony_ci 337db96d56Sopenharmony_ci The ``pickle`` module **is not secure**. Only unpickle data you trust. 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci It is possible to construct malicious pickle data which will **execute 367db96d56Sopenharmony_ci arbitrary code during unpickling**. Never unpickle data that could have come 377db96d56Sopenharmony_ci from an untrusted source, or that could have been tampered with. 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci Consider signing data with :mod:`hmac` if you need to ensure that it has not 407db96d56Sopenharmony_ci been tampered with. 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci Safer serialization formats such as :mod:`json` may be more appropriate if 437db96d56Sopenharmony_ci you are processing untrusted data. See :ref:`comparison-with-json`. 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci 467db96d56Sopenharmony_ciRelationship to other Python modules 477db96d56Sopenharmony_ci------------------------------------ 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_ciComparison with ``marshal`` 507db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^ 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ciPython has a more primitive serialization module called :mod:`marshal`, but in 537db96d56Sopenharmony_cigeneral :mod:`pickle` should always be the preferred way to serialize Python 547db96d56Sopenharmony_ciobjects. :mod:`marshal` exists primarily to support Python's :file:`.pyc` 557db96d56Sopenharmony_cifiles. 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ciThe :mod:`pickle` module differs from :mod:`marshal` in several significant ways: 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci* The :mod:`pickle` module keeps track of the objects it has already serialized, 607db96d56Sopenharmony_ci so that later references to the same object won't be serialized again. 617db96d56Sopenharmony_ci :mod:`marshal` doesn't do this. 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci This has implications both for recursive objects and object sharing. Recursive 647db96d56Sopenharmony_ci objects are objects that contain references to themselves. These are not 657db96d56Sopenharmony_ci handled by marshal, and in fact, attempting to marshal recursive objects will 667db96d56Sopenharmony_ci crash your Python interpreter. Object sharing happens when there are multiple 677db96d56Sopenharmony_ci references to the same object in different places in the object hierarchy being 687db96d56Sopenharmony_ci serialized. :mod:`pickle` stores such objects only once, and ensures that all 697db96d56Sopenharmony_ci other references point to the master copy. Shared objects remain shared, which 707db96d56Sopenharmony_ci can be very important for mutable objects. 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci* :mod:`marshal` cannot be used to serialize user-defined classes and their 737db96d56Sopenharmony_ci instances. :mod:`pickle` can save and restore class instances transparently, 747db96d56Sopenharmony_ci however the class definition must be importable and live in the same module as 757db96d56Sopenharmony_ci when the object was stored. 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci* The :mod:`marshal` serialization format is not guaranteed to be portable 787db96d56Sopenharmony_ci across Python versions. Because its primary job in life is to support 797db96d56Sopenharmony_ci :file:`.pyc` files, the Python implementers reserve the right to change the 807db96d56Sopenharmony_ci serialization format in non-backwards compatible ways should the need arise. 817db96d56Sopenharmony_ci The :mod:`pickle` serialization format is guaranteed to be backwards compatible 827db96d56Sopenharmony_ci across Python releases provided a compatible pickle protocol is chosen and 837db96d56Sopenharmony_ci pickling and unpickling code deals with Python 2 to Python 3 type differences 847db96d56Sopenharmony_ci if your data is crossing that unique breaking change language boundary. 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci.. _comparison-with-json: 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ciComparison with ``json`` 907db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^ 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ciThere are fundamental differences between the pickle protocols and 937db96d56Sopenharmony_ci`JSON (JavaScript Object Notation) <https://json.org>`_: 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci* JSON is a text serialization format (it outputs unicode text, although 967db96d56Sopenharmony_ci most of the time it is then encoded to ``utf-8``), while pickle is 977db96d56Sopenharmony_ci a binary serialization format; 987db96d56Sopenharmony_ci 997db96d56Sopenharmony_ci* JSON is human-readable, while pickle is not; 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci* JSON is interoperable and widely used outside of the Python ecosystem, 1027db96d56Sopenharmony_ci while pickle is Python-specific; 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci* JSON, by default, can only represent a subset of the Python built-in 1057db96d56Sopenharmony_ci types, and no custom classes; pickle can represent an extremely large 1067db96d56Sopenharmony_ci number of Python types (many of them automatically, by clever usage 1077db96d56Sopenharmony_ci of Python's introspection facilities; complex cases can be tackled by 1087db96d56Sopenharmony_ci implementing :ref:`specific object APIs <pickle-inst>`); 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci* Unlike pickle, deserializing untrusted JSON does not in itself create an 1117db96d56Sopenharmony_ci arbitrary code execution vulnerability. 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci.. seealso:: 1147db96d56Sopenharmony_ci The :mod:`json` module: a standard library module allowing JSON 1157db96d56Sopenharmony_ci serialization and deserialization. 1167db96d56Sopenharmony_ci 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci.. _pickle-protocols: 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ciData stream format 1217db96d56Sopenharmony_ci------------------ 1227db96d56Sopenharmony_ci 1237db96d56Sopenharmony_ci.. index:: 1247db96d56Sopenharmony_ci single: External Data Representation 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ciThe data format used by :mod:`pickle` is Python-specific. This has the 1277db96d56Sopenharmony_ciadvantage that there are no restrictions imposed by external standards such as 1287db96d56Sopenharmony_ciJSON or XDR (which can't represent pointer sharing); however it means that 1297db96d56Sopenharmony_cinon-Python programs may not be able to reconstruct pickled Python objects. 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ciBy default, the :mod:`pickle` data format uses a relatively compact binary 1327db96d56Sopenharmony_cirepresentation. If you need optimal size characteristics, you can efficiently 1337db96d56Sopenharmony_ci:doc:`compress <archiving>` pickled data. 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ciThe module :mod:`pickletools` contains tools for analyzing data streams 1367db96d56Sopenharmony_cigenerated by :mod:`pickle`. :mod:`pickletools` source code has extensive 1377db96d56Sopenharmony_cicomments about opcodes used by pickle protocols. 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ciThere are currently 6 different protocols which can be used for pickling. 1407db96d56Sopenharmony_ciThe higher the protocol used, the more recent the version of Python needed 1417db96d56Sopenharmony_cito read the pickle produced. 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci* Protocol version 0 is the original "human-readable" protocol and is 1447db96d56Sopenharmony_ci backwards compatible with earlier versions of Python. 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci* Protocol version 1 is an old binary format which is also compatible with 1477db96d56Sopenharmony_ci earlier versions of Python. 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci* Protocol version 2 was introduced in Python 2.3. It provides much more 1507db96d56Sopenharmony_ci efficient pickling of :term:`new-style classes <new-style class>`. Refer to :pep:`307` for 1517db96d56Sopenharmony_ci information about improvements brought by protocol 2. 1527db96d56Sopenharmony_ci 1537db96d56Sopenharmony_ci* Protocol version 3 was added in Python 3.0. It has explicit support for 1547db96d56Sopenharmony_ci :class:`bytes` objects and cannot be unpickled by Python 2.x. This was 1557db96d56Sopenharmony_ci the default protocol in Python 3.0--3.7. 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_ci* Protocol version 4 was added in Python 3.4. It adds support for very large 1587db96d56Sopenharmony_ci objects, pickling more kinds of objects, and some data format 1597db96d56Sopenharmony_ci optimizations. It is the default protocol starting with Python 3.8. 1607db96d56Sopenharmony_ci Refer to :pep:`3154` for information about improvements brought by 1617db96d56Sopenharmony_ci protocol 4. 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ci* Protocol version 5 was added in Python 3.8. It adds support for out-of-band 1647db96d56Sopenharmony_ci data and speedup for in-band data. Refer to :pep:`574` for information about 1657db96d56Sopenharmony_ci improvements brought by protocol 5. 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci.. note:: 1687db96d56Sopenharmony_ci Serialization is a more primitive notion than persistence; although 1697db96d56Sopenharmony_ci :mod:`pickle` reads and writes file objects, it does not handle the issue of 1707db96d56Sopenharmony_ci naming persistent objects, nor the (even more complicated) issue of concurrent 1717db96d56Sopenharmony_ci access to persistent objects. The :mod:`pickle` module can transform a complex 1727db96d56Sopenharmony_ci object into a byte stream and it can transform the byte stream into an object 1737db96d56Sopenharmony_ci with the same internal structure. Perhaps the most obvious thing to do with 1747db96d56Sopenharmony_ci these byte streams is to write them onto a file, but it is also conceivable to 1757db96d56Sopenharmony_ci send them across a network or store them in a database. The :mod:`shelve` 1767db96d56Sopenharmony_ci module provides a simple interface to pickle and unpickle objects on 1777db96d56Sopenharmony_ci DBM-style database files. 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ciModule Interface 1817db96d56Sopenharmony_ci---------------- 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ciTo serialize an object hierarchy, you simply call the :func:`dumps` function. 1847db96d56Sopenharmony_ciSimilarly, to de-serialize a data stream, you call the :func:`loads` function. 1857db96d56Sopenharmony_ciHowever, if you want more control over serialization and de-serialization, 1867db96d56Sopenharmony_ciyou can create a :class:`Pickler` or an :class:`Unpickler` object, respectively. 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ciThe :mod:`pickle` module provides the following constants: 1897db96d56Sopenharmony_ci 1907db96d56Sopenharmony_ci 1917db96d56Sopenharmony_ci.. data:: HIGHEST_PROTOCOL 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci An integer, the highest :ref:`protocol version <pickle-protocols>` 1947db96d56Sopenharmony_ci available. This value can be passed as a *protocol* value to functions 1957db96d56Sopenharmony_ci :func:`dump` and :func:`dumps` as well as the :class:`Pickler` 1967db96d56Sopenharmony_ci constructor. 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci.. data:: DEFAULT_PROTOCOL 1997db96d56Sopenharmony_ci 2007db96d56Sopenharmony_ci An integer, the default :ref:`protocol version <pickle-protocols>` used 2017db96d56Sopenharmony_ci for pickling. May be less than :data:`HIGHEST_PROTOCOL`. Currently the 2027db96d56Sopenharmony_ci default protocol is 4, first introduced in Python 3.4 and incompatible 2037db96d56Sopenharmony_ci with previous versions. 2047db96d56Sopenharmony_ci 2057db96d56Sopenharmony_ci .. versionchanged:: 3.0 2067db96d56Sopenharmony_ci 2077db96d56Sopenharmony_ci The default protocol is 3. 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci .. versionchanged:: 3.8 2107db96d56Sopenharmony_ci 2117db96d56Sopenharmony_ci The default protocol is 4. 2127db96d56Sopenharmony_ci 2137db96d56Sopenharmony_ciThe :mod:`pickle` module provides the following functions to make the pickling 2147db96d56Sopenharmony_ciprocess more convenient: 2157db96d56Sopenharmony_ci 2167db96d56Sopenharmony_ci.. function:: dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None) 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci Write the pickled representation of the object *obj* to the open 2197db96d56Sopenharmony_ci :term:`file object` *file*. This is equivalent to 2207db96d56Sopenharmony_ci ``Pickler(file, protocol).dump(obj)``. 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci Arguments *file*, *protocol*, *fix_imports* and *buffer_callback* have 2237db96d56Sopenharmony_ci the same meaning as in the :class:`Pickler` constructor. 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ci .. versionchanged:: 3.8 2267db96d56Sopenharmony_ci The *buffer_callback* argument was added. 2277db96d56Sopenharmony_ci 2287db96d56Sopenharmony_ci.. function:: dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None) 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci Return the pickled representation of the object *obj* as a :class:`bytes` object, 2317db96d56Sopenharmony_ci instead of writing it to a file. 2327db96d56Sopenharmony_ci 2337db96d56Sopenharmony_ci Arguments *protocol*, *fix_imports* and *buffer_callback* have the same 2347db96d56Sopenharmony_ci meaning as in the :class:`Pickler` constructor. 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ci .. versionchanged:: 3.8 2377db96d56Sopenharmony_ci The *buffer_callback* argument was added. 2387db96d56Sopenharmony_ci 2397db96d56Sopenharmony_ci.. function:: load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci Read the pickled representation of an object from the open :term:`file object` 2427db96d56Sopenharmony_ci *file* and return the reconstituted object hierarchy specified therein. 2437db96d56Sopenharmony_ci This is equivalent to ``Unpickler(file).load()``. 2447db96d56Sopenharmony_ci 2457db96d56Sopenharmony_ci The protocol version of the pickle is detected automatically, so no 2467db96d56Sopenharmony_ci protocol argument is needed. Bytes past the pickled representation 2477db96d56Sopenharmony_ci of the object are ignored. 2487db96d56Sopenharmony_ci 2497db96d56Sopenharmony_ci Arguments *file*, *fix_imports*, *encoding*, *errors*, *strict* and *buffers* 2507db96d56Sopenharmony_ci have the same meaning as in the :class:`Unpickler` constructor. 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci .. versionchanged:: 3.8 2537db96d56Sopenharmony_ci The *buffers* argument was added. 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci.. function:: loads(data, /, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) 2567db96d56Sopenharmony_ci 2577db96d56Sopenharmony_ci Return the reconstituted object hierarchy of the pickled representation 2587db96d56Sopenharmony_ci *data* of an object. *data* must be a :term:`bytes-like object`. 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci The protocol version of the pickle is detected automatically, so no 2617db96d56Sopenharmony_ci protocol argument is needed. Bytes past the pickled representation 2627db96d56Sopenharmony_ci of the object are ignored. 2637db96d56Sopenharmony_ci 2647db96d56Sopenharmony_ci Arguments *fix_imports*, *encoding*, *errors*, *strict* and *buffers* 2657db96d56Sopenharmony_ci have the same meaning as in the :class:`Unpickler` constructor. 2667db96d56Sopenharmony_ci 2677db96d56Sopenharmony_ci .. versionchanged:: 3.8 2687db96d56Sopenharmony_ci The *buffers* argument was added. 2697db96d56Sopenharmony_ci 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ciThe :mod:`pickle` module defines three exceptions: 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci.. exception:: PickleError 2747db96d56Sopenharmony_ci 2757db96d56Sopenharmony_ci Common base class for the other pickling exceptions. It inherits 2767db96d56Sopenharmony_ci :exc:`Exception`. 2777db96d56Sopenharmony_ci 2787db96d56Sopenharmony_ci.. exception:: PicklingError 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci Error raised when an unpicklable object is encountered by :class:`Pickler`. 2817db96d56Sopenharmony_ci It inherits :exc:`PickleError`. 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci Refer to :ref:`pickle-picklable` to learn what kinds of objects can be 2847db96d56Sopenharmony_ci pickled. 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ci.. exception:: UnpicklingError 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ci Error raised when there is a problem unpickling an object, such as a data 2897db96d56Sopenharmony_ci corruption or a security violation. It inherits :exc:`PickleError`. 2907db96d56Sopenharmony_ci 2917db96d56Sopenharmony_ci Note that other exceptions may also be raised during unpickling, including 2927db96d56Sopenharmony_ci (but not necessarily limited to) AttributeError, EOFError, ImportError, and 2937db96d56Sopenharmony_ci IndexError. 2947db96d56Sopenharmony_ci 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ciThe :mod:`pickle` module exports three classes, :class:`Pickler`, 2977db96d56Sopenharmony_ci:class:`Unpickler` and :class:`PickleBuffer`: 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci.. class:: Pickler(file, protocol=None, *, fix_imports=True, buffer_callback=None) 3007db96d56Sopenharmony_ci 3017db96d56Sopenharmony_ci This takes a binary file for writing a pickle data stream. 3027db96d56Sopenharmony_ci 3037db96d56Sopenharmony_ci The optional *protocol* argument, an integer, tells the pickler to use 3047db96d56Sopenharmony_ci the given protocol; supported protocols are 0 to :data:`HIGHEST_PROTOCOL`. 3057db96d56Sopenharmony_ci If not specified, the default is :data:`DEFAULT_PROTOCOL`. If a negative 3067db96d56Sopenharmony_ci number is specified, :data:`HIGHEST_PROTOCOL` is selected. 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci The *file* argument must have a write() method that accepts a single bytes 3097db96d56Sopenharmony_ci argument. It can thus be an on-disk file opened for binary writing, an 3107db96d56Sopenharmony_ci :class:`io.BytesIO` instance, or any other custom object that meets this 3117db96d56Sopenharmony_ci interface. 3127db96d56Sopenharmony_ci 3137db96d56Sopenharmony_ci If *fix_imports* is true and *protocol* is less than 3, pickle will try to 3147db96d56Sopenharmony_ci map the new Python 3 names to the old module names used in Python 2, so 3157db96d56Sopenharmony_ci that the pickle data stream is readable with Python 2. 3167db96d56Sopenharmony_ci 3177db96d56Sopenharmony_ci If *buffer_callback* is None (the default), buffer views are 3187db96d56Sopenharmony_ci serialized into *file* as part of the pickle stream. 3197db96d56Sopenharmony_ci 3207db96d56Sopenharmony_ci If *buffer_callback* is not None, then it can be called any number 3217db96d56Sopenharmony_ci of times with a buffer view. If the callback returns a false value 3227db96d56Sopenharmony_ci (such as None), the given buffer is :ref:`out-of-band <pickle-oob>`; 3237db96d56Sopenharmony_ci otherwise the buffer is serialized in-band, i.e. inside the pickle stream. 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci It is an error if *buffer_callback* is not None and *protocol* is 3267db96d56Sopenharmony_ci None or smaller than 5. 3277db96d56Sopenharmony_ci 3287db96d56Sopenharmony_ci .. versionchanged:: 3.8 3297db96d56Sopenharmony_ci The *buffer_callback* argument was added. 3307db96d56Sopenharmony_ci 3317db96d56Sopenharmony_ci .. method:: dump(obj) 3327db96d56Sopenharmony_ci 3337db96d56Sopenharmony_ci Write the pickled representation of *obj* to the open file object given in 3347db96d56Sopenharmony_ci the constructor. 3357db96d56Sopenharmony_ci 3367db96d56Sopenharmony_ci .. method:: persistent_id(obj) 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci Do nothing by default. This exists so a subclass can override it. 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci If :meth:`persistent_id` returns ``None``, *obj* is pickled as usual. Any 3417db96d56Sopenharmony_ci other value causes :class:`Pickler` to emit the returned value as a 3427db96d56Sopenharmony_ci persistent ID for *obj*. The meaning of this persistent ID should be 3437db96d56Sopenharmony_ci defined by :meth:`Unpickler.persistent_load`. Note that the value 3447db96d56Sopenharmony_ci returned by :meth:`persistent_id` cannot itself have a persistent ID. 3457db96d56Sopenharmony_ci 3467db96d56Sopenharmony_ci See :ref:`pickle-persistent` for details and examples of uses. 3477db96d56Sopenharmony_ci 3487db96d56Sopenharmony_ci .. attribute:: dispatch_table 3497db96d56Sopenharmony_ci 3507db96d56Sopenharmony_ci A pickler object's dispatch table is a registry of *reduction 3517db96d56Sopenharmony_ci functions* of the kind which can be declared using 3527db96d56Sopenharmony_ci :func:`copyreg.pickle`. It is a mapping whose keys are classes 3537db96d56Sopenharmony_ci and whose values are reduction functions. A reduction function 3547db96d56Sopenharmony_ci takes a single argument of the associated class and should 3557db96d56Sopenharmony_ci conform to the same interface as a :meth:`__reduce__` 3567db96d56Sopenharmony_ci method. 3577db96d56Sopenharmony_ci 3587db96d56Sopenharmony_ci By default, a pickler object will not have a 3597db96d56Sopenharmony_ci :attr:`dispatch_table` attribute, and it will instead use the 3607db96d56Sopenharmony_ci global dispatch table managed by the :mod:`copyreg` module. 3617db96d56Sopenharmony_ci However, to customize the pickling for a specific pickler object 3627db96d56Sopenharmony_ci one can set the :attr:`dispatch_table` attribute to a dict-like 3637db96d56Sopenharmony_ci object. Alternatively, if a subclass of :class:`Pickler` has a 3647db96d56Sopenharmony_ci :attr:`dispatch_table` attribute then this will be used as the 3657db96d56Sopenharmony_ci default dispatch table for instances of that class. 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ci See :ref:`pickle-dispatch` for usage examples. 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci .. versionadded:: 3.3 3707db96d56Sopenharmony_ci 3717db96d56Sopenharmony_ci .. method:: reducer_override(obj) 3727db96d56Sopenharmony_ci 3737db96d56Sopenharmony_ci Special reducer that can be defined in :class:`Pickler` subclasses. This 3747db96d56Sopenharmony_ci method has priority over any reducer in the :attr:`dispatch_table`. It 3757db96d56Sopenharmony_ci should conform to the same interface as a :meth:`__reduce__` method, and 3767db96d56Sopenharmony_ci can optionally return ``NotImplemented`` to fallback on 3777db96d56Sopenharmony_ci :attr:`dispatch_table`-registered reducers to pickle ``obj``. 3787db96d56Sopenharmony_ci 3797db96d56Sopenharmony_ci For a detailed example, see :ref:`reducer_override`. 3807db96d56Sopenharmony_ci 3817db96d56Sopenharmony_ci .. versionadded:: 3.8 3827db96d56Sopenharmony_ci 3837db96d56Sopenharmony_ci .. attribute:: fast 3847db96d56Sopenharmony_ci 3857db96d56Sopenharmony_ci Deprecated. Enable fast mode if set to a true value. The fast mode 3867db96d56Sopenharmony_ci disables the usage of memo, therefore speeding the pickling process by not 3877db96d56Sopenharmony_ci generating superfluous PUT opcodes. It should not be used with 3887db96d56Sopenharmony_ci self-referential objects, doing otherwise will cause :class:`Pickler` to 3897db96d56Sopenharmony_ci recurse infinitely. 3907db96d56Sopenharmony_ci 3917db96d56Sopenharmony_ci Use :func:`pickletools.optimize` if you need more compact pickles. 3927db96d56Sopenharmony_ci 3937db96d56Sopenharmony_ci 3947db96d56Sopenharmony_ci.. class:: Unpickler(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None) 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci This takes a binary file for reading a pickle data stream. 3977db96d56Sopenharmony_ci 3987db96d56Sopenharmony_ci The protocol version of the pickle is detected automatically, so no 3997db96d56Sopenharmony_ci protocol argument is needed. 4007db96d56Sopenharmony_ci 4017db96d56Sopenharmony_ci The argument *file* must have three methods, a read() method that takes an 4027db96d56Sopenharmony_ci integer argument, a readinto() method that takes a buffer argument 4037db96d56Sopenharmony_ci and a readline() method that requires no arguments, as in the 4047db96d56Sopenharmony_ci :class:`io.BufferedIOBase` interface. Thus *file* can be an on-disk file 4057db96d56Sopenharmony_ci opened for binary reading, an :class:`io.BytesIO` object, or any other 4067db96d56Sopenharmony_ci custom object that meets this interface. 4077db96d56Sopenharmony_ci 4087db96d56Sopenharmony_ci The optional arguments *fix_imports*, *encoding* and *errors* are used 4097db96d56Sopenharmony_ci to control compatibility support for pickle stream generated by Python 2. 4107db96d56Sopenharmony_ci If *fix_imports* is true, pickle will try to map the old Python 2 names 4117db96d56Sopenharmony_ci to the new names used in Python 3. The *encoding* and *errors* tell 4127db96d56Sopenharmony_ci pickle how to decode 8-bit string instances pickled by Python 2; 4137db96d56Sopenharmony_ci these default to 'ASCII' and 'strict', respectively. The *encoding* can 4147db96d56Sopenharmony_ci be 'bytes' to read these 8-bit string instances as bytes objects. 4157db96d56Sopenharmony_ci Using ``encoding='latin1'`` is required for unpickling NumPy arrays and 4167db96d56Sopenharmony_ci instances of :class:`~datetime.datetime`, :class:`~datetime.date` and 4177db96d56Sopenharmony_ci :class:`~datetime.time` pickled by Python 2. 4187db96d56Sopenharmony_ci 4197db96d56Sopenharmony_ci If *buffers* is None (the default), then all data necessary for 4207db96d56Sopenharmony_ci deserialization must be contained in the pickle stream. This means 4217db96d56Sopenharmony_ci that the *buffer_callback* argument was None when a :class:`Pickler` 4227db96d56Sopenharmony_ci was instantiated (or when :func:`dump` or :func:`dumps` was called). 4237db96d56Sopenharmony_ci 4247db96d56Sopenharmony_ci If *buffers* is not None, it should be an iterable of buffer-enabled 4257db96d56Sopenharmony_ci objects that is consumed each time the pickle stream references 4267db96d56Sopenharmony_ci an :ref:`out-of-band <pickle-oob>` buffer view. Such buffers have been 4277db96d56Sopenharmony_ci given in order to the *buffer_callback* of a Pickler object. 4287db96d56Sopenharmony_ci 4297db96d56Sopenharmony_ci .. versionchanged:: 3.8 4307db96d56Sopenharmony_ci The *buffers* argument was added. 4317db96d56Sopenharmony_ci 4327db96d56Sopenharmony_ci .. method:: load() 4337db96d56Sopenharmony_ci 4347db96d56Sopenharmony_ci Read the pickled representation of an object from the open file object 4357db96d56Sopenharmony_ci given in the constructor, and return the reconstituted object hierarchy 4367db96d56Sopenharmony_ci specified therein. Bytes past the pickled representation of the object 4377db96d56Sopenharmony_ci are ignored. 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci .. method:: persistent_load(pid) 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_ci Raise an :exc:`UnpicklingError` by default. 4427db96d56Sopenharmony_ci 4437db96d56Sopenharmony_ci If defined, :meth:`persistent_load` should return the object specified by 4447db96d56Sopenharmony_ci the persistent ID *pid*. If an invalid persistent ID is encountered, an 4457db96d56Sopenharmony_ci :exc:`UnpicklingError` should be raised. 4467db96d56Sopenharmony_ci 4477db96d56Sopenharmony_ci See :ref:`pickle-persistent` for details and examples of uses. 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci .. method:: find_class(module, name) 4507db96d56Sopenharmony_ci 4517db96d56Sopenharmony_ci Import *module* if necessary and return the object called *name* from it, 4527db96d56Sopenharmony_ci where the *module* and *name* arguments are :class:`str` objects. Note, 4537db96d56Sopenharmony_ci unlike its name suggests, :meth:`find_class` is also used for finding 4547db96d56Sopenharmony_ci functions. 4557db96d56Sopenharmony_ci 4567db96d56Sopenharmony_ci Subclasses may override this to gain control over what type of objects and 4577db96d56Sopenharmony_ci how they can be loaded, potentially reducing security risks. Refer to 4587db96d56Sopenharmony_ci :ref:`pickle-restrict` for details. 4597db96d56Sopenharmony_ci 4607db96d56Sopenharmony_ci .. audit-event:: pickle.find_class module,name pickle.Unpickler.find_class 4617db96d56Sopenharmony_ci 4627db96d56Sopenharmony_ci.. class:: PickleBuffer(buffer) 4637db96d56Sopenharmony_ci 4647db96d56Sopenharmony_ci A wrapper for a buffer representing picklable data. *buffer* must be a 4657db96d56Sopenharmony_ci :ref:`buffer-providing <bufferobjects>` object, such as a 4667db96d56Sopenharmony_ci :term:`bytes-like object` or a N-dimensional array. 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci :class:`PickleBuffer` is itself a buffer provider, therefore it is 4697db96d56Sopenharmony_ci possible to pass it to other APIs expecting a buffer-providing object, 4707db96d56Sopenharmony_ci such as :class:`memoryview`. 4717db96d56Sopenharmony_ci 4727db96d56Sopenharmony_ci :class:`PickleBuffer` objects can only be serialized using pickle 4737db96d56Sopenharmony_ci protocol 5 or higher. They are eligible for 4747db96d56Sopenharmony_ci :ref:`out-of-band serialization <pickle-oob>`. 4757db96d56Sopenharmony_ci 4767db96d56Sopenharmony_ci .. versionadded:: 3.8 4777db96d56Sopenharmony_ci 4787db96d56Sopenharmony_ci .. method:: raw() 4797db96d56Sopenharmony_ci 4807db96d56Sopenharmony_ci Return a :class:`memoryview` of the memory area underlying this buffer. 4817db96d56Sopenharmony_ci The returned object is a one-dimensional, C-contiguous memoryview 4827db96d56Sopenharmony_ci with format ``B`` (unsigned bytes). :exc:`BufferError` is raised if 4837db96d56Sopenharmony_ci the buffer is neither C- nor Fortran-contiguous. 4847db96d56Sopenharmony_ci 4857db96d56Sopenharmony_ci .. method:: release() 4867db96d56Sopenharmony_ci 4877db96d56Sopenharmony_ci Release the underlying buffer exposed by the PickleBuffer object. 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_ci 4907db96d56Sopenharmony_ci.. _pickle-picklable: 4917db96d56Sopenharmony_ci 4927db96d56Sopenharmony_ciWhat can be pickled and unpickled? 4937db96d56Sopenharmony_ci---------------------------------- 4947db96d56Sopenharmony_ci 4957db96d56Sopenharmony_ciThe following types can be pickled: 4967db96d56Sopenharmony_ci 4977db96d56Sopenharmony_ci* ``None``, ``True``, and ``False``; 4987db96d56Sopenharmony_ci 4997db96d56Sopenharmony_ci* integers, floating-point numbers, complex numbers; 5007db96d56Sopenharmony_ci 5017db96d56Sopenharmony_ci* strings, bytes, bytearrays; 5027db96d56Sopenharmony_ci 5037db96d56Sopenharmony_ci* tuples, lists, sets, and dictionaries containing only picklable objects; 5047db96d56Sopenharmony_ci 5057db96d56Sopenharmony_ci* functions (built-in and user-defined) accessible from the top level of a 5067db96d56Sopenharmony_ci module (using :keyword:`def`, not :keyword:`lambda`); 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci* classes accessible from the top level of a module; 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ci* instances of such classes whose the result of calling :meth:`__getstate__` 5117db96d56Sopenharmony_ci is picklable (see section :ref:`pickle-inst` for details). 5127db96d56Sopenharmony_ci 5137db96d56Sopenharmony_ciAttempts to pickle unpicklable objects will raise the :exc:`PicklingError` 5147db96d56Sopenharmony_ciexception; when this happens, an unspecified number of bytes may have already 5157db96d56Sopenharmony_cibeen written to the underlying file. Trying to pickle a highly recursive data 5167db96d56Sopenharmony_cistructure may exceed the maximum recursion depth, a :exc:`RecursionError` will be 5177db96d56Sopenharmony_ciraised in this case. You can carefully raise this limit with 5187db96d56Sopenharmony_ci:func:`sys.setrecursionlimit`. 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ciNote that functions (built-in and user-defined) are pickled by fully 5217db96d56Sopenharmony_ci:term:`qualified name`, not by value. [#]_ This means that only the function name is 5227db96d56Sopenharmony_cipickled, along with the name of the containing module and classes. Neither 5237db96d56Sopenharmony_cithe function's code, nor any of its function attributes are pickled. Thus the 5247db96d56Sopenharmony_cidefining module must be importable in the unpickling environment, and the module 5257db96d56Sopenharmony_cimust contain the named object, otherwise an exception will be raised. [#]_ 5267db96d56Sopenharmony_ci 5277db96d56Sopenharmony_ciSimilarly, classes are pickled by fully qualified name, so the same restrictions in 5287db96d56Sopenharmony_cithe unpickling environment apply. Note that none of the class's code or data is 5297db96d56Sopenharmony_cipickled, so in the following example the class attribute ``attr`` is not 5307db96d56Sopenharmony_cirestored in the unpickling environment:: 5317db96d56Sopenharmony_ci 5327db96d56Sopenharmony_ci class Foo: 5337db96d56Sopenharmony_ci attr = 'A class attribute' 5347db96d56Sopenharmony_ci 5357db96d56Sopenharmony_ci picklestring = pickle.dumps(Foo) 5367db96d56Sopenharmony_ci 5377db96d56Sopenharmony_ciThese restrictions are why picklable functions and classes must be defined at 5387db96d56Sopenharmony_cithe top level of a module. 5397db96d56Sopenharmony_ci 5407db96d56Sopenharmony_ciSimilarly, when class instances are pickled, their class's code and data are not 5417db96d56Sopenharmony_cipickled along with them. Only the instance data are pickled. This is done on 5427db96d56Sopenharmony_cipurpose, so you can fix bugs in a class or add methods to the class and still 5437db96d56Sopenharmony_ciload objects that were created with an earlier version of the class. If you 5447db96d56Sopenharmony_ciplan to have long-lived objects that will see many versions of a class, it may 5457db96d56Sopenharmony_cibe worthwhile to put a version number in the objects so that suitable 5467db96d56Sopenharmony_ciconversions can be made by the class's :meth:`__setstate__` method. 5477db96d56Sopenharmony_ci 5487db96d56Sopenharmony_ci 5497db96d56Sopenharmony_ci.. _pickle-inst: 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ciPickling Class Instances 5527db96d56Sopenharmony_ci------------------------ 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_ci.. currentmodule:: None 5557db96d56Sopenharmony_ci 5567db96d56Sopenharmony_ciIn this section, we describe the general mechanisms available to you to define, 5577db96d56Sopenharmony_cicustomize, and control how class instances are pickled and unpickled. 5587db96d56Sopenharmony_ci 5597db96d56Sopenharmony_ciIn most cases, no additional code is needed to make instances picklable. By 5607db96d56Sopenharmony_cidefault, pickle will retrieve the class and the attributes of an instance via 5617db96d56Sopenharmony_ciintrospection. When a class instance is unpickled, its :meth:`__init__` method 5627db96d56Sopenharmony_ciis usually *not* invoked. The default behaviour first creates an uninitialized 5637db96d56Sopenharmony_ciinstance and then restores the saved attributes. The following code shows an 5647db96d56Sopenharmony_ciimplementation of this behaviour:: 5657db96d56Sopenharmony_ci 5667db96d56Sopenharmony_ci def save(obj): 5677db96d56Sopenharmony_ci return (obj.__class__, obj.__dict__) 5687db96d56Sopenharmony_ci 5697db96d56Sopenharmony_ci def restore(cls, attributes): 5707db96d56Sopenharmony_ci obj = cls.__new__(cls) 5717db96d56Sopenharmony_ci obj.__dict__.update(attributes) 5727db96d56Sopenharmony_ci return obj 5737db96d56Sopenharmony_ci 5747db96d56Sopenharmony_ciClasses can alter the default behaviour by providing one or several special 5757db96d56Sopenharmony_cimethods: 5767db96d56Sopenharmony_ci 5777db96d56Sopenharmony_ci.. method:: object.__getnewargs_ex__() 5787db96d56Sopenharmony_ci 5797db96d56Sopenharmony_ci In protocols 2 and newer, classes that implements the 5807db96d56Sopenharmony_ci :meth:`__getnewargs_ex__` method can dictate the values passed to the 5817db96d56Sopenharmony_ci :meth:`__new__` method upon unpickling. The method must return a pair 5827db96d56Sopenharmony_ci ``(args, kwargs)`` where *args* is a tuple of positional arguments 5837db96d56Sopenharmony_ci and *kwargs* a dictionary of named arguments for constructing the 5847db96d56Sopenharmony_ci object. Those will be passed to the :meth:`__new__` method upon 5857db96d56Sopenharmony_ci unpickling. 5867db96d56Sopenharmony_ci 5877db96d56Sopenharmony_ci You should implement this method if the :meth:`__new__` method of your 5887db96d56Sopenharmony_ci class requires keyword-only arguments. Otherwise, it is recommended for 5897db96d56Sopenharmony_ci compatibility to implement :meth:`__getnewargs__`. 5907db96d56Sopenharmony_ci 5917db96d56Sopenharmony_ci .. versionchanged:: 3.6 5927db96d56Sopenharmony_ci :meth:`__getnewargs_ex__` is now used in protocols 2 and 3. 5937db96d56Sopenharmony_ci 5947db96d56Sopenharmony_ci 5957db96d56Sopenharmony_ci.. method:: object.__getnewargs__() 5967db96d56Sopenharmony_ci 5977db96d56Sopenharmony_ci This method serves a similar purpose as :meth:`__getnewargs_ex__`, but 5987db96d56Sopenharmony_ci supports only positional arguments. It must return a tuple of arguments 5997db96d56Sopenharmony_ci ``args`` which will be passed to the :meth:`__new__` method upon unpickling. 6007db96d56Sopenharmony_ci 6017db96d56Sopenharmony_ci :meth:`__getnewargs__` will not be called if :meth:`__getnewargs_ex__` is 6027db96d56Sopenharmony_ci defined. 6037db96d56Sopenharmony_ci 6047db96d56Sopenharmony_ci .. versionchanged:: 3.6 6057db96d56Sopenharmony_ci Before Python 3.6, :meth:`__getnewargs__` was called instead of 6067db96d56Sopenharmony_ci :meth:`__getnewargs_ex__` in protocols 2 and 3. 6077db96d56Sopenharmony_ci 6087db96d56Sopenharmony_ci 6097db96d56Sopenharmony_ci.. method:: object.__getstate__() 6107db96d56Sopenharmony_ci 6117db96d56Sopenharmony_ci Classes can further influence how their instances are pickled by overriding 6127db96d56Sopenharmony_ci the method :meth:`__getstate__`. It is called and the returned object 6137db96d56Sopenharmony_ci is pickled as the contents for the instance, instead of a default state. 6147db96d56Sopenharmony_ci There are several cases: 6157db96d56Sopenharmony_ci 6167db96d56Sopenharmony_ci * For a class that has no instance :attr:`~object.__dict__` and no 6177db96d56Sopenharmony_ci :attr:`~object.__slots__`, the default state is ``None``. 6187db96d56Sopenharmony_ci 6197db96d56Sopenharmony_ci * For a class that has an instance :attr:`~object.__dict__` and no 6207db96d56Sopenharmony_ci :attr:`~object.__slots__`, the default state is ``self.__dict__``. 6217db96d56Sopenharmony_ci 6227db96d56Sopenharmony_ci * For a class that has an instance :attr:`~object.__dict__` and 6237db96d56Sopenharmony_ci :attr:`~object.__slots__`, the default state is a tuple consisting of two 6247db96d56Sopenharmony_ci dictionaries: ``self.__dict__``, and a dictionary mapping slot 6257db96d56Sopenharmony_ci names to slot values. Only slots that have a value are 6267db96d56Sopenharmony_ci included in the latter. 6277db96d56Sopenharmony_ci 6287db96d56Sopenharmony_ci * For a class that has :attr:`~object.__slots__` and no instance 6297db96d56Sopenharmony_ci :attr:`~object.__dict__`, the default state is a tuple whose first item 6307db96d56Sopenharmony_ci is ``None`` and whose second item is a dictionary mapping slot names 6317db96d56Sopenharmony_ci to slot values described in the previous bullet. 6327db96d56Sopenharmony_ci 6337db96d56Sopenharmony_ci .. versionchanged:: 3.11 6347db96d56Sopenharmony_ci Added the default implementation of the ``__getstate__()`` method in the 6357db96d56Sopenharmony_ci :class:`object` class. 6367db96d56Sopenharmony_ci 6377db96d56Sopenharmony_ci 6387db96d56Sopenharmony_ci.. method:: object.__setstate__(state) 6397db96d56Sopenharmony_ci 6407db96d56Sopenharmony_ci Upon unpickling, if the class defines :meth:`__setstate__`, it is called with 6417db96d56Sopenharmony_ci the unpickled state. In that case, there is no requirement for the state 6427db96d56Sopenharmony_ci object to be a dictionary. Otherwise, the pickled state must be a dictionary 6437db96d56Sopenharmony_ci and its items are assigned to the new instance's dictionary. 6447db96d56Sopenharmony_ci 6457db96d56Sopenharmony_ci .. note:: 6467db96d56Sopenharmony_ci 6477db96d56Sopenharmony_ci If :meth:`__getstate__` returns a false value, the :meth:`__setstate__` 6487db96d56Sopenharmony_ci method will not be called upon unpickling. 6497db96d56Sopenharmony_ci 6507db96d56Sopenharmony_ci 6517db96d56Sopenharmony_ciRefer to the section :ref:`pickle-state` for more information about how to use 6527db96d56Sopenharmony_cithe methods :meth:`__getstate__` and :meth:`__setstate__`. 6537db96d56Sopenharmony_ci 6547db96d56Sopenharmony_ci.. note:: 6557db96d56Sopenharmony_ci 6567db96d56Sopenharmony_ci At unpickling time, some methods like :meth:`__getattr__`, 6577db96d56Sopenharmony_ci :meth:`__getattribute__`, or :meth:`__setattr__` may be called upon the 6587db96d56Sopenharmony_ci instance. In case those methods rely on some internal invariant being 6597db96d56Sopenharmony_ci true, the type should implement :meth:`__new__` to establish such an 6607db96d56Sopenharmony_ci invariant, as :meth:`__init__` is not called when unpickling an 6617db96d56Sopenharmony_ci instance. 6627db96d56Sopenharmony_ci 6637db96d56Sopenharmony_ci.. index:: pair: copy; protocol 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ciAs we shall see, pickle does not use directly the methods described above. In 6667db96d56Sopenharmony_cifact, these methods are part of the copy protocol which implements the 6677db96d56Sopenharmony_ci:meth:`__reduce__` special method. The copy protocol provides a unified 6687db96d56Sopenharmony_ciinterface for retrieving the data necessary for pickling and copying 6697db96d56Sopenharmony_ciobjects. [#]_ 6707db96d56Sopenharmony_ci 6717db96d56Sopenharmony_ciAlthough powerful, implementing :meth:`__reduce__` directly in your classes is 6727db96d56Sopenharmony_cierror prone. For this reason, class designers should use the high-level 6737db96d56Sopenharmony_ciinterface (i.e., :meth:`__getnewargs_ex__`, :meth:`__getstate__` and 6747db96d56Sopenharmony_ci:meth:`__setstate__`) whenever possible. We will show, however, cases where 6757db96d56Sopenharmony_ciusing :meth:`__reduce__` is the only option or leads to more efficient pickling 6767db96d56Sopenharmony_cior both. 6777db96d56Sopenharmony_ci 6787db96d56Sopenharmony_ci.. method:: object.__reduce__() 6797db96d56Sopenharmony_ci 6807db96d56Sopenharmony_ci The interface is currently defined as follows. The :meth:`__reduce__` method 6817db96d56Sopenharmony_ci takes no argument and shall return either a string or preferably a tuple (the 6827db96d56Sopenharmony_ci returned object is often referred to as the "reduce value"). 6837db96d56Sopenharmony_ci 6847db96d56Sopenharmony_ci If a string is returned, the string should be interpreted as the name of a 6857db96d56Sopenharmony_ci global variable. It should be the object's local name relative to its 6867db96d56Sopenharmony_ci module; the pickle module searches the module namespace to determine the 6877db96d56Sopenharmony_ci object's module. This behaviour is typically useful for singletons. 6887db96d56Sopenharmony_ci 6897db96d56Sopenharmony_ci When a tuple is returned, it must be between two and six items long. 6907db96d56Sopenharmony_ci Optional items can either be omitted, or ``None`` can be provided as their 6917db96d56Sopenharmony_ci value. The semantics of each item are in order: 6927db96d56Sopenharmony_ci 6937db96d56Sopenharmony_ci .. XXX Mention __newobj__ special-case? 6947db96d56Sopenharmony_ci 6957db96d56Sopenharmony_ci * A callable object that will be called to create the initial version of the 6967db96d56Sopenharmony_ci object. 6977db96d56Sopenharmony_ci 6987db96d56Sopenharmony_ci * A tuple of arguments for the callable object. An empty tuple must be given 6997db96d56Sopenharmony_ci if the callable does not accept any argument. 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ci * Optionally, the object's state, which will be passed to the object's 7027db96d56Sopenharmony_ci :meth:`__setstate__` method as previously described. If the object has no 7037db96d56Sopenharmony_ci such method then, the value must be a dictionary and it will be added to 7047db96d56Sopenharmony_ci the object's :attr:`~object.__dict__` attribute. 7057db96d56Sopenharmony_ci 7067db96d56Sopenharmony_ci * Optionally, an iterator (and not a sequence) yielding successive items. 7077db96d56Sopenharmony_ci These items will be appended to the object either using 7087db96d56Sopenharmony_ci ``obj.append(item)`` or, in batch, using ``obj.extend(list_of_items)``. 7097db96d56Sopenharmony_ci This is primarily used for list subclasses, but may be used by other 7107db96d56Sopenharmony_ci classes as long as they have :meth:`append` and :meth:`extend` methods with 7117db96d56Sopenharmony_ci the appropriate signature. (Whether :meth:`append` or :meth:`extend` is 7127db96d56Sopenharmony_ci used depends on which pickle protocol version is used as well as the number 7137db96d56Sopenharmony_ci of items to append, so both must be supported.) 7147db96d56Sopenharmony_ci 7157db96d56Sopenharmony_ci * Optionally, an iterator (not a sequence) yielding successive key-value 7167db96d56Sopenharmony_ci pairs. These items will be stored to the object using ``obj[key] = 7177db96d56Sopenharmony_ci value``. This is primarily used for dictionary subclasses, but may be used 7187db96d56Sopenharmony_ci by other classes as long as they implement :meth:`__setitem__`. 7197db96d56Sopenharmony_ci 7207db96d56Sopenharmony_ci * Optionally, a callable with a ``(obj, state)`` signature. This 7217db96d56Sopenharmony_ci callable allows the user to programmatically control the state-updating 7227db96d56Sopenharmony_ci behavior of a specific object, instead of using ``obj``'s static 7237db96d56Sopenharmony_ci :meth:`__setstate__` method. If not ``None``, this callable will have 7247db96d56Sopenharmony_ci priority over ``obj``'s :meth:`__setstate__`. 7257db96d56Sopenharmony_ci 7267db96d56Sopenharmony_ci .. versionadded:: 3.8 7277db96d56Sopenharmony_ci The optional sixth tuple item, ``(obj, state)``, was added. 7287db96d56Sopenharmony_ci 7297db96d56Sopenharmony_ci 7307db96d56Sopenharmony_ci.. method:: object.__reduce_ex__(protocol) 7317db96d56Sopenharmony_ci 7327db96d56Sopenharmony_ci Alternatively, a :meth:`__reduce_ex__` method may be defined. The only 7337db96d56Sopenharmony_ci difference is this method should take a single integer argument, the protocol 7347db96d56Sopenharmony_ci version. When defined, pickle will prefer it over the :meth:`__reduce__` 7357db96d56Sopenharmony_ci method. In addition, :meth:`__reduce__` automatically becomes a synonym for 7367db96d56Sopenharmony_ci the extended version. The main use for this method is to provide 7377db96d56Sopenharmony_ci backwards-compatible reduce values for older Python releases. 7387db96d56Sopenharmony_ci 7397db96d56Sopenharmony_ci.. currentmodule:: pickle 7407db96d56Sopenharmony_ci 7417db96d56Sopenharmony_ci.. _pickle-persistent: 7427db96d56Sopenharmony_ci 7437db96d56Sopenharmony_ciPersistence of External Objects 7447db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 7457db96d56Sopenharmony_ci 7467db96d56Sopenharmony_ci.. index:: 7477db96d56Sopenharmony_ci single: persistent_id (pickle protocol) 7487db96d56Sopenharmony_ci single: persistent_load (pickle protocol) 7497db96d56Sopenharmony_ci 7507db96d56Sopenharmony_ciFor the benefit of object persistence, the :mod:`pickle` module supports the 7517db96d56Sopenharmony_cinotion of a reference to an object outside the pickled data stream. Such 7527db96d56Sopenharmony_ciobjects are referenced by a persistent ID, which should be either a string of 7537db96d56Sopenharmony_cialphanumeric characters (for protocol 0) [#]_ or just an arbitrary object (for 7547db96d56Sopenharmony_ciany newer protocol). 7557db96d56Sopenharmony_ci 7567db96d56Sopenharmony_ciThe resolution of such persistent IDs is not defined by the :mod:`pickle` 7577db96d56Sopenharmony_cimodule; it will delegate this resolution to the user-defined methods on the 7587db96d56Sopenharmony_cipickler and unpickler, :meth:`~Pickler.persistent_id` and 7597db96d56Sopenharmony_ci:meth:`~Unpickler.persistent_load` respectively. 7607db96d56Sopenharmony_ci 7617db96d56Sopenharmony_ciTo pickle objects that have an external persistent ID, the pickler must have a 7627db96d56Sopenharmony_cicustom :meth:`~Pickler.persistent_id` method that takes an object as an 7637db96d56Sopenharmony_ciargument and returns either ``None`` or the persistent ID for that object. 7647db96d56Sopenharmony_ciWhen ``None`` is returned, the pickler simply pickles the object as normal. 7657db96d56Sopenharmony_ciWhen a persistent ID string is returned, the pickler will pickle that object, 7667db96d56Sopenharmony_cialong with a marker so that the unpickler will recognize it as a persistent ID. 7677db96d56Sopenharmony_ci 7687db96d56Sopenharmony_ciTo unpickle external objects, the unpickler must have a custom 7697db96d56Sopenharmony_ci:meth:`~Unpickler.persistent_load` method that takes a persistent ID object and 7707db96d56Sopenharmony_cireturns the referenced object. 7717db96d56Sopenharmony_ci 7727db96d56Sopenharmony_ciHere is a comprehensive example presenting how persistent ID can be used to 7737db96d56Sopenharmony_cipickle external objects by reference. 7747db96d56Sopenharmony_ci 7757db96d56Sopenharmony_ci.. literalinclude:: ../includes/dbpickle.py 7767db96d56Sopenharmony_ci 7777db96d56Sopenharmony_ci.. _pickle-dispatch: 7787db96d56Sopenharmony_ci 7797db96d56Sopenharmony_ciDispatch Tables 7807db96d56Sopenharmony_ci^^^^^^^^^^^^^^^ 7817db96d56Sopenharmony_ci 7827db96d56Sopenharmony_ciIf one wants to customize pickling of some classes without disturbing 7837db96d56Sopenharmony_ciany other code which depends on pickling, then one can create a 7847db96d56Sopenharmony_cipickler with a private dispatch table. 7857db96d56Sopenharmony_ci 7867db96d56Sopenharmony_ciThe global dispatch table managed by the :mod:`copyreg` module is 7877db96d56Sopenharmony_ciavailable as :data:`copyreg.dispatch_table`. Therefore, one may 7887db96d56Sopenharmony_cichoose to use a modified copy of :data:`copyreg.dispatch_table` as a 7897db96d56Sopenharmony_ciprivate dispatch table. 7907db96d56Sopenharmony_ci 7917db96d56Sopenharmony_ciFor example :: 7927db96d56Sopenharmony_ci 7937db96d56Sopenharmony_ci f = io.BytesIO() 7947db96d56Sopenharmony_ci p = pickle.Pickler(f) 7957db96d56Sopenharmony_ci p.dispatch_table = copyreg.dispatch_table.copy() 7967db96d56Sopenharmony_ci p.dispatch_table[SomeClass] = reduce_SomeClass 7977db96d56Sopenharmony_ci 7987db96d56Sopenharmony_cicreates an instance of :class:`pickle.Pickler` with a private dispatch 7997db96d56Sopenharmony_citable which handles the ``SomeClass`` class specially. Alternatively, 8007db96d56Sopenharmony_cithe code :: 8017db96d56Sopenharmony_ci 8027db96d56Sopenharmony_ci class MyPickler(pickle.Pickler): 8037db96d56Sopenharmony_ci dispatch_table = copyreg.dispatch_table.copy() 8047db96d56Sopenharmony_ci dispatch_table[SomeClass] = reduce_SomeClass 8057db96d56Sopenharmony_ci f = io.BytesIO() 8067db96d56Sopenharmony_ci p = MyPickler(f) 8077db96d56Sopenharmony_ci 8087db96d56Sopenharmony_cidoes the same but all instances of ``MyPickler`` will by default 8097db96d56Sopenharmony_cishare the private dispatch table. On the other hand, the code :: 8107db96d56Sopenharmony_ci 8117db96d56Sopenharmony_ci copyreg.pickle(SomeClass, reduce_SomeClass) 8127db96d56Sopenharmony_ci f = io.BytesIO() 8137db96d56Sopenharmony_ci p = pickle.Pickler(f) 8147db96d56Sopenharmony_ci 8157db96d56Sopenharmony_cimodifies the global dispatch table shared by all users of the :mod:`copyreg` module. 8167db96d56Sopenharmony_ci 8177db96d56Sopenharmony_ci.. _pickle-state: 8187db96d56Sopenharmony_ci 8197db96d56Sopenharmony_ciHandling Stateful Objects 8207db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^ 8217db96d56Sopenharmony_ci 8227db96d56Sopenharmony_ci.. index:: 8237db96d56Sopenharmony_ci single: __getstate__() (copy protocol) 8247db96d56Sopenharmony_ci single: __setstate__() (copy protocol) 8257db96d56Sopenharmony_ci 8267db96d56Sopenharmony_ciHere's an example that shows how to modify pickling behavior for a class. 8277db96d56Sopenharmony_ciThe :class:`TextReader` class opens a text file, and returns the line number and 8287db96d56Sopenharmony_ciline contents each time its :meth:`!readline` method is called. If a 8297db96d56Sopenharmony_ci:class:`TextReader` instance is pickled, all attributes *except* the file object 8307db96d56Sopenharmony_cimember are saved. When the instance is unpickled, the file is reopened, and 8317db96d56Sopenharmony_cireading resumes from the last location. The :meth:`__setstate__` and 8327db96d56Sopenharmony_ci:meth:`__getstate__` methods are used to implement this behavior. :: 8337db96d56Sopenharmony_ci 8347db96d56Sopenharmony_ci class TextReader: 8357db96d56Sopenharmony_ci """Print and number lines in a text file.""" 8367db96d56Sopenharmony_ci 8377db96d56Sopenharmony_ci def __init__(self, filename): 8387db96d56Sopenharmony_ci self.filename = filename 8397db96d56Sopenharmony_ci self.file = open(filename) 8407db96d56Sopenharmony_ci self.lineno = 0 8417db96d56Sopenharmony_ci 8427db96d56Sopenharmony_ci def readline(self): 8437db96d56Sopenharmony_ci self.lineno += 1 8447db96d56Sopenharmony_ci line = self.file.readline() 8457db96d56Sopenharmony_ci if not line: 8467db96d56Sopenharmony_ci return None 8477db96d56Sopenharmony_ci if line.endswith('\n'): 8487db96d56Sopenharmony_ci line = line[:-1] 8497db96d56Sopenharmony_ci return "%i: %s" % (self.lineno, line) 8507db96d56Sopenharmony_ci 8517db96d56Sopenharmony_ci def __getstate__(self): 8527db96d56Sopenharmony_ci # Copy the object's state from self.__dict__ which contains 8537db96d56Sopenharmony_ci # all our instance attributes. Always use the dict.copy() 8547db96d56Sopenharmony_ci # method to avoid modifying the original state. 8557db96d56Sopenharmony_ci state = self.__dict__.copy() 8567db96d56Sopenharmony_ci # Remove the unpicklable entries. 8577db96d56Sopenharmony_ci del state['file'] 8587db96d56Sopenharmony_ci return state 8597db96d56Sopenharmony_ci 8607db96d56Sopenharmony_ci def __setstate__(self, state): 8617db96d56Sopenharmony_ci # Restore instance attributes (i.e., filename and lineno). 8627db96d56Sopenharmony_ci self.__dict__.update(state) 8637db96d56Sopenharmony_ci # Restore the previously opened file's state. To do so, we need to 8647db96d56Sopenharmony_ci # reopen it and read from it until the line count is restored. 8657db96d56Sopenharmony_ci file = open(self.filename) 8667db96d56Sopenharmony_ci for _ in range(self.lineno): 8677db96d56Sopenharmony_ci file.readline() 8687db96d56Sopenharmony_ci # Finally, save the file. 8697db96d56Sopenharmony_ci self.file = file 8707db96d56Sopenharmony_ci 8717db96d56Sopenharmony_ci 8727db96d56Sopenharmony_ciA sample usage might be something like this:: 8737db96d56Sopenharmony_ci 8747db96d56Sopenharmony_ci >>> reader = TextReader("hello.txt") 8757db96d56Sopenharmony_ci >>> reader.readline() 8767db96d56Sopenharmony_ci '1: Hello world!' 8777db96d56Sopenharmony_ci >>> reader.readline() 8787db96d56Sopenharmony_ci '2: I am line number two.' 8797db96d56Sopenharmony_ci >>> new_reader = pickle.loads(pickle.dumps(reader)) 8807db96d56Sopenharmony_ci >>> new_reader.readline() 8817db96d56Sopenharmony_ci '3: Goodbye!' 8827db96d56Sopenharmony_ci 8837db96d56Sopenharmony_ci.. _reducer_override: 8847db96d56Sopenharmony_ci 8857db96d56Sopenharmony_ciCustom Reduction for Types, Functions, and Other Objects 8867db96d56Sopenharmony_ci-------------------------------------------------------- 8877db96d56Sopenharmony_ci 8887db96d56Sopenharmony_ci.. versionadded:: 3.8 8897db96d56Sopenharmony_ci 8907db96d56Sopenharmony_ciSometimes, :attr:`~Pickler.dispatch_table` may not be flexible enough. 8917db96d56Sopenharmony_ciIn particular we may want to customize pickling based on another criterion 8927db96d56Sopenharmony_cithan the object's type, or we may want to customize the pickling of 8937db96d56Sopenharmony_cifunctions and classes. 8947db96d56Sopenharmony_ci 8957db96d56Sopenharmony_ciFor those cases, it is possible to subclass from the :class:`Pickler` class and 8967db96d56Sopenharmony_ciimplement a :meth:`~Pickler.reducer_override` method. This method can return an 8977db96d56Sopenharmony_ciarbitrary reduction tuple (see :meth:`__reduce__`). It can alternatively return 8987db96d56Sopenharmony_ci``NotImplemented`` to fallback to the traditional behavior. 8997db96d56Sopenharmony_ci 9007db96d56Sopenharmony_ciIf both the :attr:`~Pickler.dispatch_table` and 9017db96d56Sopenharmony_ci:meth:`~Pickler.reducer_override` are defined, then 9027db96d56Sopenharmony_ci:meth:`~Pickler.reducer_override` method takes priority. 9037db96d56Sopenharmony_ci 9047db96d56Sopenharmony_ci.. Note:: 9057db96d56Sopenharmony_ci For performance reasons, :meth:`~Pickler.reducer_override` may not be 9067db96d56Sopenharmony_ci called for the following objects: ``None``, ``True``, ``False``, and 9077db96d56Sopenharmony_ci exact instances of :class:`int`, :class:`float`, :class:`bytes`, 9087db96d56Sopenharmony_ci :class:`str`, :class:`dict`, :class:`set`, :class:`frozenset`, :class:`list` 9097db96d56Sopenharmony_ci and :class:`tuple`. 9107db96d56Sopenharmony_ci 9117db96d56Sopenharmony_ciHere is a simple example where we allow pickling and reconstructing 9127db96d56Sopenharmony_cia given class:: 9137db96d56Sopenharmony_ci 9147db96d56Sopenharmony_ci import io 9157db96d56Sopenharmony_ci import pickle 9167db96d56Sopenharmony_ci 9177db96d56Sopenharmony_ci class MyClass: 9187db96d56Sopenharmony_ci my_attribute = 1 9197db96d56Sopenharmony_ci 9207db96d56Sopenharmony_ci class MyPickler(pickle.Pickler): 9217db96d56Sopenharmony_ci def reducer_override(self, obj): 9227db96d56Sopenharmony_ci """Custom reducer for MyClass.""" 9237db96d56Sopenharmony_ci if getattr(obj, "__name__", None) == "MyClass": 9247db96d56Sopenharmony_ci return type, (obj.__name__, obj.__bases__, 9257db96d56Sopenharmony_ci {'my_attribute': obj.my_attribute}) 9267db96d56Sopenharmony_ci else: 9277db96d56Sopenharmony_ci # For any other object, fallback to usual reduction 9287db96d56Sopenharmony_ci return NotImplemented 9297db96d56Sopenharmony_ci 9307db96d56Sopenharmony_ci f = io.BytesIO() 9317db96d56Sopenharmony_ci p = MyPickler(f) 9327db96d56Sopenharmony_ci p.dump(MyClass) 9337db96d56Sopenharmony_ci 9347db96d56Sopenharmony_ci del MyClass 9357db96d56Sopenharmony_ci 9367db96d56Sopenharmony_ci unpickled_class = pickle.loads(f.getvalue()) 9377db96d56Sopenharmony_ci 9387db96d56Sopenharmony_ci assert isinstance(unpickled_class, type) 9397db96d56Sopenharmony_ci assert unpickled_class.__name__ == "MyClass" 9407db96d56Sopenharmony_ci assert unpickled_class.my_attribute == 1 9417db96d56Sopenharmony_ci 9427db96d56Sopenharmony_ci 9437db96d56Sopenharmony_ci.. _pickle-oob: 9447db96d56Sopenharmony_ci 9457db96d56Sopenharmony_ciOut-of-band Buffers 9467db96d56Sopenharmony_ci------------------- 9477db96d56Sopenharmony_ci 9487db96d56Sopenharmony_ci.. versionadded:: 3.8 9497db96d56Sopenharmony_ci 9507db96d56Sopenharmony_ciIn some contexts, the :mod:`pickle` module is used to transfer massive amounts 9517db96d56Sopenharmony_ciof data. Therefore, it can be important to minimize the number of memory 9527db96d56Sopenharmony_cicopies, to preserve performance and resource consumption. However, normal 9537db96d56Sopenharmony_cioperation of the :mod:`pickle` module, as it transforms a graph-like structure 9547db96d56Sopenharmony_ciof objects into a sequential stream of bytes, intrinsically involves copying 9557db96d56Sopenharmony_cidata to and from the pickle stream. 9567db96d56Sopenharmony_ci 9577db96d56Sopenharmony_ciThis constraint can be eschewed if both the *provider* (the implementation 9587db96d56Sopenharmony_ciof the object types to be transferred) and the *consumer* (the implementation 9597db96d56Sopenharmony_ciof the communications system) support the out-of-band transfer facilities 9607db96d56Sopenharmony_ciprovided by pickle protocol 5 and higher. 9617db96d56Sopenharmony_ci 9627db96d56Sopenharmony_ciProvider API 9637db96d56Sopenharmony_ci^^^^^^^^^^^^ 9647db96d56Sopenharmony_ci 9657db96d56Sopenharmony_ciThe large data objects to be pickled must implement a :meth:`__reduce_ex__` 9667db96d56Sopenharmony_cimethod specialized for protocol 5 and higher, which returns a 9677db96d56Sopenharmony_ci:class:`PickleBuffer` instance (instead of e.g. a :class:`bytes` object) 9687db96d56Sopenharmony_cifor any large data. 9697db96d56Sopenharmony_ci 9707db96d56Sopenharmony_ciA :class:`PickleBuffer` object *signals* that the underlying buffer is 9717db96d56Sopenharmony_cieligible for out-of-band data transfer. Those objects remain compatible 9727db96d56Sopenharmony_ciwith normal usage of the :mod:`pickle` module. However, consumers can also 9737db96d56Sopenharmony_ciopt-in to tell :mod:`pickle` that they will handle those buffers by 9747db96d56Sopenharmony_cithemselves. 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ciConsumer API 9777db96d56Sopenharmony_ci^^^^^^^^^^^^ 9787db96d56Sopenharmony_ci 9797db96d56Sopenharmony_ciA communications system can enable custom handling of the :class:`PickleBuffer` 9807db96d56Sopenharmony_ciobjects generated when serializing an object graph. 9817db96d56Sopenharmony_ci 9827db96d56Sopenharmony_ciOn the sending side, it needs to pass a *buffer_callback* argument to 9837db96d56Sopenharmony_ci:class:`Pickler` (or to the :func:`dump` or :func:`dumps` function), which 9847db96d56Sopenharmony_ciwill be called with each :class:`PickleBuffer` generated while pickling 9857db96d56Sopenharmony_cithe object graph. Buffers accumulated by the *buffer_callback* will not 9867db96d56Sopenharmony_cisee their data copied into the pickle stream, only a cheap marker will be 9877db96d56Sopenharmony_ciinserted. 9887db96d56Sopenharmony_ci 9897db96d56Sopenharmony_ciOn the receiving side, it needs to pass a *buffers* argument to 9907db96d56Sopenharmony_ci:class:`Unpickler` (or to the :func:`load` or :func:`loads` function), 9917db96d56Sopenharmony_ciwhich is an iterable of the buffers which were passed to *buffer_callback*. 9927db96d56Sopenharmony_ciThat iterable should produce buffers in the same order as they were passed 9937db96d56Sopenharmony_cito *buffer_callback*. Those buffers will provide the data expected by the 9947db96d56Sopenharmony_cireconstructors of the objects whose pickling produced the original 9957db96d56Sopenharmony_ci:class:`PickleBuffer` objects. 9967db96d56Sopenharmony_ci 9977db96d56Sopenharmony_ciBetween the sending side and the receiving side, the communications system 9987db96d56Sopenharmony_ciis free to implement its own transfer mechanism for out-of-band buffers. 9997db96d56Sopenharmony_ciPotential optimizations include the use of shared memory or datatype-dependent 10007db96d56Sopenharmony_cicompression. 10017db96d56Sopenharmony_ci 10027db96d56Sopenharmony_ciExample 10037db96d56Sopenharmony_ci^^^^^^^ 10047db96d56Sopenharmony_ci 10057db96d56Sopenharmony_ciHere is a trivial example where we implement a :class:`bytearray` subclass 10067db96d56Sopenharmony_ciable to participate in out-of-band buffer pickling:: 10077db96d56Sopenharmony_ci 10087db96d56Sopenharmony_ci class ZeroCopyByteArray(bytearray): 10097db96d56Sopenharmony_ci 10107db96d56Sopenharmony_ci def __reduce_ex__(self, protocol): 10117db96d56Sopenharmony_ci if protocol >= 5: 10127db96d56Sopenharmony_ci return type(self)._reconstruct, (PickleBuffer(self),), None 10137db96d56Sopenharmony_ci else: 10147db96d56Sopenharmony_ci # PickleBuffer is forbidden with pickle protocols <= 4. 10157db96d56Sopenharmony_ci return type(self)._reconstruct, (bytearray(self),) 10167db96d56Sopenharmony_ci 10177db96d56Sopenharmony_ci @classmethod 10187db96d56Sopenharmony_ci def _reconstruct(cls, obj): 10197db96d56Sopenharmony_ci with memoryview(obj) as m: 10207db96d56Sopenharmony_ci # Get a handle over the original buffer object 10217db96d56Sopenharmony_ci obj = m.obj 10227db96d56Sopenharmony_ci if type(obj) is cls: 10237db96d56Sopenharmony_ci # Original buffer object is a ZeroCopyByteArray, return it 10247db96d56Sopenharmony_ci # as-is. 10257db96d56Sopenharmony_ci return obj 10267db96d56Sopenharmony_ci else: 10277db96d56Sopenharmony_ci return cls(obj) 10287db96d56Sopenharmony_ci 10297db96d56Sopenharmony_ciThe reconstructor (the ``_reconstruct`` class method) returns the buffer's 10307db96d56Sopenharmony_ciproviding object if it has the right type. This is an easy way to simulate 10317db96d56Sopenharmony_cizero-copy behaviour on this toy example. 10327db96d56Sopenharmony_ci 10337db96d56Sopenharmony_ciOn the consumer side, we can pickle those objects the usual way, which 10347db96d56Sopenharmony_ciwhen unserialized will give us a copy of the original object:: 10357db96d56Sopenharmony_ci 10367db96d56Sopenharmony_ci b = ZeroCopyByteArray(b"abc") 10377db96d56Sopenharmony_ci data = pickle.dumps(b, protocol=5) 10387db96d56Sopenharmony_ci new_b = pickle.loads(data) 10397db96d56Sopenharmony_ci print(b == new_b) # True 10407db96d56Sopenharmony_ci print(b is new_b) # False: a copy was made 10417db96d56Sopenharmony_ci 10427db96d56Sopenharmony_ciBut if we pass a *buffer_callback* and then give back the accumulated 10437db96d56Sopenharmony_cibuffers when unserializing, we are able to get back the original object:: 10447db96d56Sopenharmony_ci 10457db96d56Sopenharmony_ci b = ZeroCopyByteArray(b"abc") 10467db96d56Sopenharmony_ci buffers = [] 10477db96d56Sopenharmony_ci data = pickle.dumps(b, protocol=5, buffer_callback=buffers.append) 10487db96d56Sopenharmony_ci new_b = pickle.loads(data, buffers=buffers) 10497db96d56Sopenharmony_ci print(b == new_b) # True 10507db96d56Sopenharmony_ci print(b is new_b) # True: no copy was made 10517db96d56Sopenharmony_ci 10527db96d56Sopenharmony_ciThis example is limited by the fact that :class:`bytearray` allocates its 10537db96d56Sopenharmony_ciown memory: you cannot create a :class:`bytearray` instance that is backed 10547db96d56Sopenharmony_ciby another object's memory. However, third-party datatypes such as NumPy 10557db96d56Sopenharmony_ciarrays do not have this limitation, and allow use of zero-copy pickling 10567db96d56Sopenharmony_ci(or making as few copies as possible) when transferring between distinct 10577db96d56Sopenharmony_ciprocesses or systems. 10587db96d56Sopenharmony_ci 10597db96d56Sopenharmony_ci.. seealso:: :pep:`574` -- Pickle protocol 5 with out-of-band data 10607db96d56Sopenharmony_ci 10617db96d56Sopenharmony_ci 10627db96d56Sopenharmony_ci.. _pickle-restrict: 10637db96d56Sopenharmony_ci 10647db96d56Sopenharmony_ciRestricting Globals 10657db96d56Sopenharmony_ci------------------- 10667db96d56Sopenharmony_ci 10677db96d56Sopenharmony_ci.. index:: 10687db96d56Sopenharmony_ci single: find_class() (pickle protocol) 10697db96d56Sopenharmony_ci 10707db96d56Sopenharmony_ciBy default, unpickling will import any class or function that it finds in the 10717db96d56Sopenharmony_cipickle data. For many applications, this behaviour is unacceptable as it 10727db96d56Sopenharmony_cipermits the unpickler to import and invoke arbitrary code. Just consider what 10737db96d56Sopenharmony_cithis hand-crafted pickle data stream does when loaded:: 10747db96d56Sopenharmony_ci 10757db96d56Sopenharmony_ci >>> import pickle 10767db96d56Sopenharmony_ci >>> pickle.loads(b"cos\nsystem\n(S'echo hello world'\ntR.") 10777db96d56Sopenharmony_ci hello world 10787db96d56Sopenharmony_ci 0 10797db96d56Sopenharmony_ci 10807db96d56Sopenharmony_ciIn this example, the unpickler imports the :func:`os.system` function and then 10817db96d56Sopenharmony_ciapply the string argument "echo hello world". Although this example is 10827db96d56Sopenharmony_ciinoffensive, it is not difficult to imagine one that could damage your system. 10837db96d56Sopenharmony_ci 10847db96d56Sopenharmony_ciFor this reason, you may want to control what gets unpickled by customizing 10857db96d56Sopenharmony_ci:meth:`Unpickler.find_class`. Unlike its name suggests, 10867db96d56Sopenharmony_ci:meth:`Unpickler.find_class` is called whenever a global (i.e., a class or 10877db96d56Sopenharmony_cia function) is requested. Thus it is possible to either completely forbid 10887db96d56Sopenharmony_ciglobals or restrict them to a safe subset. 10897db96d56Sopenharmony_ci 10907db96d56Sopenharmony_ciHere is an example of an unpickler allowing only few safe classes from the 10917db96d56Sopenharmony_ci:mod:`builtins` module to be loaded:: 10927db96d56Sopenharmony_ci 10937db96d56Sopenharmony_ci import builtins 10947db96d56Sopenharmony_ci import io 10957db96d56Sopenharmony_ci import pickle 10967db96d56Sopenharmony_ci 10977db96d56Sopenharmony_ci safe_builtins = { 10987db96d56Sopenharmony_ci 'range', 10997db96d56Sopenharmony_ci 'complex', 11007db96d56Sopenharmony_ci 'set', 11017db96d56Sopenharmony_ci 'frozenset', 11027db96d56Sopenharmony_ci 'slice', 11037db96d56Sopenharmony_ci } 11047db96d56Sopenharmony_ci 11057db96d56Sopenharmony_ci class RestrictedUnpickler(pickle.Unpickler): 11067db96d56Sopenharmony_ci 11077db96d56Sopenharmony_ci def find_class(self, module, name): 11087db96d56Sopenharmony_ci # Only allow safe classes from builtins. 11097db96d56Sopenharmony_ci if module == "builtins" and name in safe_builtins: 11107db96d56Sopenharmony_ci return getattr(builtins, name) 11117db96d56Sopenharmony_ci # Forbid everything else. 11127db96d56Sopenharmony_ci raise pickle.UnpicklingError("global '%s.%s' is forbidden" % 11137db96d56Sopenharmony_ci (module, name)) 11147db96d56Sopenharmony_ci 11157db96d56Sopenharmony_ci def restricted_loads(s): 11167db96d56Sopenharmony_ci """Helper function analogous to pickle.loads().""" 11177db96d56Sopenharmony_ci return RestrictedUnpickler(io.BytesIO(s)).load() 11187db96d56Sopenharmony_ci 11197db96d56Sopenharmony_ciA sample usage of our unpickler working as intended:: 11207db96d56Sopenharmony_ci 11217db96d56Sopenharmony_ci >>> restricted_loads(pickle.dumps([1, 2, range(15)])) 11227db96d56Sopenharmony_ci [1, 2, range(0, 15)] 11237db96d56Sopenharmony_ci >>> restricted_loads(b"cos\nsystem\n(S'echo hello world'\ntR.") 11247db96d56Sopenharmony_ci Traceback (most recent call last): 11257db96d56Sopenharmony_ci ... 11267db96d56Sopenharmony_ci pickle.UnpicklingError: global 'os.system' is forbidden 11277db96d56Sopenharmony_ci >>> restricted_loads(b'cbuiltins\neval\n' 11287db96d56Sopenharmony_ci ... b'(S\'getattr(__import__("os"), "system")' 11297db96d56Sopenharmony_ci ... b'("echo hello world")\'\ntR.') 11307db96d56Sopenharmony_ci Traceback (most recent call last): 11317db96d56Sopenharmony_ci ... 11327db96d56Sopenharmony_ci pickle.UnpicklingError: global 'builtins.eval' is forbidden 11337db96d56Sopenharmony_ci 11347db96d56Sopenharmony_ci 11357db96d56Sopenharmony_ci.. XXX Add note about how extension codes could evade our protection 11367db96d56Sopenharmony_ci mechanism (e.g. cached classes do not invokes find_class()). 11377db96d56Sopenharmony_ci 11387db96d56Sopenharmony_ciAs our examples shows, you have to be careful with what you allow to be 11397db96d56Sopenharmony_ciunpickled. Therefore if security is a concern, you may want to consider 11407db96d56Sopenharmony_cialternatives such as the marshalling API in :mod:`xmlrpc.client` or 11417db96d56Sopenharmony_cithird-party solutions. 11427db96d56Sopenharmony_ci 11437db96d56Sopenharmony_ci 11447db96d56Sopenharmony_ciPerformance 11457db96d56Sopenharmony_ci----------- 11467db96d56Sopenharmony_ci 11477db96d56Sopenharmony_ciRecent versions of the pickle protocol (from protocol 2 and upwards) feature 11487db96d56Sopenharmony_ciefficient binary encodings for several common features and built-in types. 11497db96d56Sopenharmony_ciAlso, the :mod:`pickle` module has a transparent optimizer written in C. 11507db96d56Sopenharmony_ci 11517db96d56Sopenharmony_ci 11527db96d56Sopenharmony_ci.. _pickle-example: 11537db96d56Sopenharmony_ci 11547db96d56Sopenharmony_ciExamples 11557db96d56Sopenharmony_ci-------- 11567db96d56Sopenharmony_ci 11577db96d56Sopenharmony_ciFor the simplest code, use the :func:`dump` and :func:`load` functions. :: 11587db96d56Sopenharmony_ci 11597db96d56Sopenharmony_ci import pickle 11607db96d56Sopenharmony_ci 11617db96d56Sopenharmony_ci # An arbitrary collection of objects supported by pickle. 11627db96d56Sopenharmony_ci data = { 11637db96d56Sopenharmony_ci 'a': [1, 2.0, 3+4j], 11647db96d56Sopenharmony_ci 'b': ("character string", b"byte string"), 11657db96d56Sopenharmony_ci 'c': {None, True, False} 11667db96d56Sopenharmony_ci } 11677db96d56Sopenharmony_ci 11687db96d56Sopenharmony_ci with open('data.pickle', 'wb') as f: 11697db96d56Sopenharmony_ci # Pickle the 'data' dictionary using the highest protocol available. 11707db96d56Sopenharmony_ci pickle.dump(data, f, pickle.HIGHEST_PROTOCOL) 11717db96d56Sopenharmony_ci 11727db96d56Sopenharmony_ci 11737db96d56Sopenharmony_ciThe following example reads the resulting pickled data. :: 11747db96d56Sopenharmony_ci 11757db96d56Sopenharmony_ci import pickle 11767db96d56Sopenharmony_ci 11777db96d56Sopenharmony_ci with open('data.pickle', 'rb') as f: 11787db96d56Sopenharmony_ci # The protocol version used is detected automatically, so we do not 11797db96d56Sopenharmony_ci # have to specify it. 11807db96d56Sopenharmony_ci data = pickle.load(f) 11817db96d56Sopenharmony_ci 11827db96d56Sopenharmony_ci 11837db96d56Sopenharmony_ci.. XXX: Add examples showing how to optimize pickles for size (like using 11847db96d56Sopenharmony_ci.. pickletools.optimize() or the gzip module). 11857db96d56Sopenharmony_ci 11867db96d56Sopenharmony_ci 11877db96d56Sopenharmony_ci.. seealso:: 11887db96d56Sopenharmony_ci 11897db96d56Sopenharmony_ci Module :mod:`copyreg` 11907db96d56Sopenharmony_ci Pickle interface constructor registration for extension types. 11917db96d56Sopenharmony_ci 11927db96d56Sopenharmony_ci Module :mod:`pickletools` 11937db96d56Sopenharmony_ci Tools for working with and analyzing pickled data. 11947db96d56Sopenharmony_ci 11957db96d56Sopenharmony_ci Module :mod:`shelve` 11967db96d56Sopenharmony_ci Indexed databases of objects; uses :mod:`pickle`. 11977db96d56Sopenharmony_ci 11987db96d56Sopenharmony_ci Module :mod:`copy` 11997db96d56Sopenharmony_ci Shallow and deep object copying. 12007db96d56Sopenharmony_ci 12017db96d56Sopenharmony_ci Module :mod:`marshal` 12027db96d56Sopenharmony_ci High-performance serialization of built-in types. 12037db96d56Sopenharmony_ci 12047db96d56Sopenharmony_ci 12057db96d56Sopenharmony_ci.. rubric:: Footnotes 12067db96d56Sopenharmony_ci 12077db96d56Sopenharmony_ci.. [#] Don't confuse this with the :mod:`marshal` module 12087db96d56Sopenharmony_ci 12097db96d56Sopenharmony_ci.. [#] This is why :keyword:`lambda` functions cannot be pickled: all 12107db96d56Sopenharmony_ci :keyword:`!lambda` functions share the same name: ``<lambda>``. 12117db96d56Sopenharmony_ci 12127db96d56Sopenharmony_ci.. [#] The exception raised will likely be an :exc:`ImportError` or an 12137db96d56Sopenharmony_ci :exc:`AttributeError` but it could be something else. 12147db96d56Sopenharmony_ci 12157db96d56Sopenharmony_ci.. [#] The :mod:`copy` module uses this protocol for shallow and deep copying 12167db96d56Sopenharmony_ci operations. 12177db96d56Sopenharmony_ci 12187db96d56Sopenharmony_ci.. [#] The limitation on alphanumeric characters is due to the fact 12197db96d56Sopenharmony_ci that persistent IDs in protocol 0 are delimited by the newline 12207db96d56Sopenharmony_ci character. Therefore if any kind of newline characters occurs in 12217db96d56Sopenharmony_ci persistent IDs, the resulting pickled data will become unreadable. 1222