Skip to main content

Fork of Python 3 pickle module.

Project description

zodbpickle README

https://travis-ci.org/zopefoundation/zodbpickle.svg?branch=master Coverage status PyPI Python versions

This package presents a uniform pickling interface for ZODB:

  • Under Python2, this package forks both Python 2.7’s pickle and cPickle modules, adding support for the protocol 3 opcodes. It also provides a new subclass of bytes, zodbpickle.binary, which Python2 applications can use to pickle binary values such that they will be unpickled as bytes under Py3k.

  • Under Py3k, this package forks the pickle module (and the supporting C extension) from both Python 3.2 and Python 3.3. The fork add support for the noload operations used by ZODB.

Caution

zodbpickle relies on Python’s pickle module. The pickle module is not intended to be secure against erroneous or maliciously constructed data. Never unpickle data received from an untrusted or unauthenticated source as arbitrary code might be executed.

Also see https://docs.python.org/3.6/library/pickle.html

General Usage

To get compatibility between Python 2 and 3 pickling, replace:

import pickle

by:

from zodbpickle import pickle

This provides compatibility, but has the effect that you get the fast implementation in Python 3, while Python 2 uses the slow version.

To get a more deterministic choice of the implementation, use one of:

from zodbpickle import fastpickle # always C
from zodbpickle import slowpickle # always Python

Both modules can co-exist which is helpful for comparison.

But there is a bit more to consider, so please read on!

Loading/Storing Python 2 Strings

In all their wisdom, the Python developers have decided that Python 2 str instances should be loaded as Python 3 str objects (i.e. unicode strings). Patches were proposed in Python issue 6784 but were never applied. This code base contains those patches.

Example 1: Loading Python 2 pickles on Python 3

$ python2
>>> import pickle
>>> pickle.dumps('\xff', protocol=0)
"S'\\xff'\np0\n."
>>> pickle.dumps('\xff', protocol=1)
'U\x01\xffq\x00.'
>>> pickle.dumps('\xff', protocol=2)
'\x80\x02U\x01\xffq\x00.'

$ python3
>>> from zodbpickle import pickle
>>> pickle.loads(b"S'\\xff'\np0\n.", encoding='bytes')
b'\xff'
>>> pickle.loads(b'U\x01\xffq\x00.', encoding='bytes')
b'\xff'
>>> pickle.loads(b'\x80\x02U\x01\xffq\x00.', encoding='bytes')
b'\xff'

Example 2: Loading Python 3 pickles on Python 2

$ python3
>>> from zodbpickle import pickle
>>> pickle.dumps(b"\xff", protocol=0)
b'c_codecs\nencode\np0\n(V\xff\np1\nVlatin1\np2\ntp3\nRp4\n.'
>>> pickle.dumps(b"\xff", protocol=1)
b'c_codecs\nencode\nq\x00(X\x02\x00\x00\x00\xc3\xbfq\x01X\x06\x00\x00\x00latin1q\x02tq\x03Rq\x04.'
>>> pickle.dumps(b"\xff", protocol=2)
b'\x80\x02c_codecs\nencode\nq\x00X\x02\x00\x00\x00\xc3\xbfq\x01X\x06\x00\x00\x00latin1q\x02\x86q\x03Rq\x04.'

$ python2
>>> import pickle
>>> pickle.loads('c_codecs\nencode\np0\n(V\xff\np1\nVlatin1\np2\ntp3\nRp4\n.')
'\xff'
>>> pickle.loads('c_codecs\nencode\nq\x00(X\x02\x00\x00\x00\xc3\xbfq\x01X\x06\x00\x00\x00latin1q\x02tq\x03Rq\x04.')
'\xff'
>>> pickle.loads('\x80\x02c_codecs\nencode\nq\x00X\x02\x00\x00\x00\xc3\xbfq\x01X\x06\x00\x00\x00latin1q\x02\x86q\x03Rq\x04.')
'\xff'

Example 3: everything breaks down

$ python2
>>> class Foo(object):
...     def __init__(self):
...         self.x = 'hello'
...
>>> import pickle
>>> pickle.dumps(Foo(), protocol=0)
"ccopy_reg\n_reconstructor\np0\n(c__main__\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'x'\np6\nS'hello'\np7\nsb."
>>> pickle.dumps(Foo(), protocol=1)
'ccopy_reg\n_reconstructor\nq\x00(c__main__\nFoo\nq\x01c__builtin__\nobject\nq\x02Ntq\x03Rq\x04}q\x05U\x01xq\x06U\x05helloq\x07sb.'
>>> pickle.dumps(Foo(), protocol=2)
'\x80\x02c__main__\nFoo\nq\x00)\x81q\x01}q\x02U\x01xq\x03U\x05helloq\x04sb.'

$ python3
>>> from zodbpickle import pickle
>>> class Foo(object): pass
...
>>> foo = pickle.loads("ccopy_reg\n_reconstructor\np0\n(c__main__\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'x'\np6\nS'hello'\np7\nsb.", encoding='bytes')
>>> foo.x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'x'

wait what?

>>> foo.__dict__
{b'x': b'hello'}

oooh. So we use encoding='ASCII' (the default) and errors='bytes' and hope it works:

>>> foo = pickle.loads("ccopy_reg\n_reconstructor\np0\n(c__main__\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'x'\np6\nS'hello'\np7\nsb.", errors='bytes')
>>> foo.x
'hello'

falling back to bytes if necessary

>>> pickle.loads(b'\x80\x02U\x01\xffq\x00.', errors='bytes')
b'\xff'

Support for noload()

The ZODB uses cPickle’s noload() method to retrieve all persistent references from a pickle without loading any objects. This feature was removed from Python 3’s pickle. Unfortuantely, this unnecessarily fills the pickle cache.

This module provides a noload() method again.

Changelog

1.0.1 (2018-05-16)

  • Fix a memory leak in pickle protocol 3 under Python 2. See issue 36.

1.0 (2018-02-09)

  • Add a warning to the readme not to use untrusted pickles.

  • Drop support for Python 3.3.

0.7.0 (2017-09-22)

  • Drop support for Python 2.6 and 3.2.

  • Add support for Jython 2.7.

  • Add support for Python 3.5 and 3.6.

0.6.0 (2015-04-02)

  • Restore the noload behaviour from Python 2.6 and provide the noload method on the non-C-accelerated unpicklers under PyPy and Python 2.

  • Add support for PyPy, PyPy3, and Python 3.4.

0.5.2 (2013-08-17)

0.5.1 (2013-07-06)

  • Update all code and tests to Python 2.6.8, 2.7.5, 3.2.5, 3.3.2 .

  • Add the modules zodbpickle.fastpickle and zodbpickle.slowpickle. This provides a version-independent choice of the C or Python implementation.

  • Fix a minor bug on OS X

0.5.0 (2013-06-14)

  • Removed support for the bytes_as_strings arguments to pickling APIs: the pickles created when that argument was true might not be unpickled without passing encoding='bytes', which ZODB couldn’t reliably enforce. On Py3k, ZODB will be using protocol=3 pickles anyway.

0.4.4 (2013-06-07)

  • Add protocol 3 opcodes to the C version of the noload() dispatcher.

0.4.3 (2013-06-07)

  • Packaging error: remove spurious -ASIDE file from sdist.

0.4.2 (2013-06-07)

  • Fix NameError in pure-Python version of Unpickler.noload_appends.

  • Fix NameError in pure-Python version of Unpickler.noload_setitems.

0.4.1 (2013-04-29)

  • Fix typo in Python2 version of zodbpickle.pickle module.

0.4 (2013-04-28)

  • Support the common pickle module interface for Python 2.6, 2.7, 3.2, and 3.3.

  • Split the Python implementations / tests into Python2- and Py3k-specific variants.

  • Added a fork of the Python 2.7 _pickle.c, for use under Python2. The fork adds support for the Py3k protocol 3 opcodes.

  • Added a custom binary type for use in Python2 apps. Derived from bytes, the binary type allows Python2 apps to pickle binary data using opcodes which will cause it to be unpickled as bytes on Py3k. Under Py3k, the binary type is just an alias for bytes.

0.3 (2013-03-18)

  • Added noload code to Python 3.2 version of Unpickler. As with the Python 3.3 version, this code remains untested.

  • Added bytes_as_strings option to the Python 3.2 version of Pickler, dump, and dumps.

0.2 (2013-03-05)

  • Added bytes_as_strings option to Pickler, dump, and dumps.

  • Incomplete support for Python 3.2:

    • Move _pickle.c -> _pickle_33.c.

    • Clone Python 3.2.3’s _pickle.c -> _pickle_32.c and apply the same patch.

    • Choose between them at build time based on sys.version_info.

    • Disable some tests of 3.3-only features.

    • Missing: implementation of noload() in _pickle_32.c.

    • Missing: implementation of bytes_as_strings=True in _pickle_32.c.

0.1.0 (2013-02-27)

  • Initial release of Python 3.3’s pickle with the patches of Python issue 6784 applied.

  • Added support for errors="bytes".

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zodbpickle-1.0.1.tar.gz (181.9 kB view details)

Uploaded Source

Built Distributions

zodbpickle-1.0.1-cp36-cp36m-win_amd64.whl (215.6 kB view details)

Uploaded CPython 3.6m Windows x86-64

zodbpickle-1.0.1-cp36-cp36m-win32.whl (208.2 kB view details)

Uploaded CPython 3.6m Windows x86

zodbpickle-1.0.1-cp35-cp35m-win_amd64.whl (215.6 kB view details)

Uploaded CPython 3.5m Windows x86-64

zodbpickle-1.0.1-cp35-cp35m-win32.whl (208.2 kB view details)

Uploaded CPython 3.5m Windows x86

zodbpickle-1.0.1-cp34-cp34m-win_amd64.whl (212.5 kB view details)

Uploaded CPython 3.4m Windows x86-64

zodbpickle-1.0.1-cp34-cp34m-win32.whl (206.6 kB view details)

Uploaded CPython 3.4m Windows x86

zodbpickle-1.0.1-cp27-cp27m-win_amd64.whl (208.4 kB view details)

Uploaded CPython 2.7m Windows x86-64

zodbpickle-1.0.1-cp27-cp27m-win32.whl (204.5 kB view details)

Uploaded CPython 2.7m Windows x86

File details

Details for the file zodbpickle-1.0.1.tar.gz.

File metadata

  • Download URL: zodbpickle-1.0.1.tar.gz
  • Upload date:
  • Size: 181.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for zodbpickle-1.0.1.tar.gz
Algorithm Hash digest
SHA256 5fdfa84f05b25511a4e1190ec98728aa487e2eb6db016a951fdbb79bcc7307e0
MD5 09b43acbb4d1032fc8772f41a42978c2
BLAKE2b-256 602763a4f7ef3fde3ffa0d4e66d3f2953798274b578fe9702bd3a75afd4e9f8d

See more details on using hashes here.

File details

Details for the file zodbpickle-1.0.1-cp36-cp36m-win_amd64.whl.

File metadata

File hashes

Hashes for zodbpickle-1.0.1-cp36-cp36m-win_amd64.whl
Algorithm Hash digest
SHA256 4964bf56b9459979b7228cc1d571c3683c55ad31b67b88133d6c0253df9bf456
MD5 254f54a646bb22f22156ec8f08cf5133
BLAKE2b-256 b6f075213e2b6a4db6434e55703bbb14666a4f51509c8cf0c15e6c496b40e0a2

See more details on using hashes here.

File details

Details for the file zodbpickle-1.0.1-cp36-cp36m-win32.whl.

File metadata

File hashes

Hashes for zodbpickle-1.0.1-cp36-cp36m-win32.whl
Algorithm Hash digest
SHA256 5c16c6209bd583096da144e2960a56d56e0577277f72e4826f77c960fc2ac34f
MD5 9a674894bcc758f238605c57936fdbb9
BLAKE2b-256 9b69a3fc504aa8fd73bee284b681a9ddfba249835ee074b4011cceefbeaf50b4

See more details on using hashes here.

File details

Details for the file zodbpickle-1.0.1-cp35-cp35m-win_amd64.whl.

File metadata

File hashes

Hashes for zodbpickle-1.0.1-cp35-cp35m-win_amd64.whl
Algorithm Hash digest
SHA256 86169ca92929e2d888ebbf25e1f8d7abeef08eaffedab5fea496c100831beefb
MD5 15202c77552d4bbc1016d287d5f9bb4e
BLAKE2b-256 c7f2e6168636b8e8de2f016980d2f78af1cca6fe52d03f8ba7db0d3fd2bd3543

See more details on using hashes here.

File details

Details for the file zodbpickle-1.0.1-cp35-cp35m-win32.whl.

File metadata

File hashes

Hashes for zodbpickle-1.0.1-cp35-cp35m-win32.whl
Algorithm Hash digest
SHA256 d64e4a2ce81e150f35674b2bb92ac85abadda3e24bca67764a35d5c168e5e99e
MD5 bf7f9fb6b88129c62f971d667a899e87
BLAKE2b-256 f39e8aeb73d9bddb8ac3a52d8007dd4e59f531a4f347372b2ec04c696243590a

See more details on using hashes here.

File details

Details for the file zodbpickle-1.0.1-cp34-cp34m-win_amd64.whl.

File metadata

File hashes

Hashes for zodbpickle-1.0.1-cp34-cp34m-win_amd64.whl
Algorithm Hash digest
SHA256 5b07352a42547169027b5186ae1b0aba3d9c278adfa3d32b4e4e18c904c906a8
MD5 2988bd927314bdc8b11567dfae82e5df
BLAKE2b-256 31b3b3587990fbdd35e9e8865e85881ab146d5f5e3012125d6c8a6bcc00c05ad

See more details on using hashes here.

File details

Details for the file zodbpickle-1.0.1-cp34-cp34m-win32.whl.

File metadata

File hashes

Hashes for zodbpickle-1.0.1-cp34-cp34m-win32.whl
Algorithm Hash digest
SHA256 6e98bf709b2662f1db5e200f5eed73126a22dc571fcb78052e2ea668b30106b6
MD5 bf505c511a00de3df720cb311bd21d4e
BLAKE2b-256 c384413d26d78190b65112d808913aa4581271f38eb09d9cfbdef132594ac0d5

See more details on using hashes here.

File details

Details for the file zodbpickle-1.0.1-cp27-cp27m-win_amd64.whl.

File metadata

File hashes

Hashes for zodbpickle-1.0.1-cp27-cp27m-win_amd64.whl
Algorithm Hash digest
SHA256 05b919d70341da9df677f564f40a7c2c97aff3338f5929d9a9ece6077b3d3247
MD5 e6a1f6a773e6d25214a9b2700f185095
BLAKE2b-256 4e24897fdb89901ff04078a51fce2765d3eff2a70ef1b2e85e51c7c39953d74f

See more details on using hashes here.

File details

Details for the file zodbpickle-1.0.1-cp27-cp27m-win32.whl.

File metadata

File hashes

Hashes for zodbpickle-1.0.1-cp27-cp27m-win32.whl
Algorithm Hash digest
SHA256 6b232db8896a87bfe5acfbbeb6255448783502e1fbdd79627f895760808b12cd
MD5 f825bf86b7bd4490f356c49b521fb98c
BLAKE2b-256 ef17766d37b5ed6c0fd1ebd8e513358d691d78b4863f4e12aa1877df8f36e387

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page