跳转到主要内容

Python 3 pickle模块的分支。

项目描述

zodbpickle README

https://github.com/zopefoundation/zodbpickle/actions/workflows/tests.yml/badge.svg Coverage status PyPI Python versions

本软件包为 ZODB 提供统一的序列化接口。

  • 在 Python 2 下,本软件包从 Python 2.7 的 picklecPickle 模块中分叉,增加了对 protocol 3 操作码的支持。它还提供了一个新的 bytes 子类,zodbpickle.binary,Python 2 应用程序可以使用它来序列化二进制值,这样在 Py3k 下反序列化时它们将以 bytes 的形式存在。

  • 在 Py3k 下,本软件包从 Python 3.2 和 Python 3.3 的 pickle 模块(以及支持 C 扩展)中分叉。分叉增加了对 ZODB 使用的 noload 操作的支持。

注意

zodbpickle 依赖于 Python 的 pickle 模块。该模块并非设计为对错误构造或恶意构造的数据具有安全性。请勿从不受信任或未经验证的来源反序列化数据,因为可能会执行任意代码。

另请参阅 https://docs.pythonlang.cn/3.6/library/pickle.html

通用用法

为了实现 Python 2 和 3 序列化的兼容性,替换

import pickle

from zodbpickle import pickle

这提供了兼容性,但效果是您在 Python 3 中获得快速实现,而 Python 2 使用慢速版本。

为了获得更确定的选择实现,请使用以下之一

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

这两个模块可以共存,这有助于比较。

但还有更多要考虑的,请继续阅读!

加载/存储 Python 2 字符串

在所有他们的智慧中,Python 开发者决定 Python 2 的 str 实例应被加载为 Python 3 的 str 对象(即 Unicode 字符串)。在 Python issue 6784 中提出了补丁,但从未被应用。此代码库包含这些补丁。

示例 1:在 Python 3 上加载 Python 2 pickles

$ 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'

示例 2:在 Python 2 上加载 Python 3 pickles

$ 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'

示例 3:一切都崩溃了

$ 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'

等等?

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

哦哦。所以我们使用 encoding='ASCII'(默认)和 errors='bytes' 并希望它工作

>>> 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'

如有必要回退到字节

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

noload() 的支持

ZODB 使用 cPicklenoload() 方法从 pickle 中检索所有持久引用,而不加载任何对象。这个功能已被从 Python 3 的 pickle 中移除。不幸的是,这会不必要地填充 pickle 缓存。

此模块再次提供了 noload() 方法。

变更日志

4.1.1 (2024-10-02)

  • 修复导入 zodbpickle.fastpickle 时出现的 NameError

4.1 (2024-09-17)

  • 添加对 Python 3.13 的最终支持。

4.0 (2024-05-30)

  • 移除对 Python 3.7 的支持。

3.3 (2024-04-16)

  • 在 GHA 上构建 Windows 轮子。

  • 从 3.13a5 开始添加对 Python 3.13 的初步支持。

3.2 (2024-02-16)

  • 从 3.13a3 开始添加对 Python 3.13 的初步支持。

3.1 (2023-10-05)

  • 添加对 Python 3.12 的支持。

3.0.1 (2023-03-28)

  • 修复 .fastpickle.slowpickle 中的 NameError

3.0 (2023-03-24)

  • 为 Python 3.11 构建 Linux 二进制轮子。

  • 从 Python 3.12a5 开始添加对 Python 3.12 的初步支持。

  • 移除对 Python 2.7、3.5、3.6 的支持。

  • 移除对已弃用的 python setup.py test 的支持。

2.6 (2022-11-17)

  • 添加在 macOS 上构建 arm64 轮子的支持。

2.5 (2022-11-03)

  • 添加对 Python 3.11 最终版本的支持。

2.4 (2022-09-15)

  • 添加对 Python 3.11(从 3.11.0b3 开始)的支持。

  • 在C代码中禁用不安全的数学优化。请参阅拉取请求73

2.3 (2022-04-22)

  • 添加对Python 3.11(截至3.11.0a7)的支持。

2.2.0 (2021-09-29)

  • 添加对Python 3.10的支持。

2.1.0 (2021-09-24)

  • 添加对Python 3.9的支持。

2.0.0 (2019-11-13)

  • CPython 2:使zodbpickle.binary对象更小,并且不会被垃圾回收器追踪。现在它们的行为更像是本机字节对象。就像那样,就像在Python 3中一样,它们不能有任意的属性或被弱引用。请参阅问题53

1.1 (2019-11-09)

  • 添加对Python 3.8的支持。

  • 停止支持Python 3.4。

1.0.4 (2019-06-12)

  • 修复在特定条件下的pickle损坏问题。请参阅拉取请求47

1.0.3 (2018-12-18)

  • 修复一个错误:zodbpickle.slowpickle将_Pickler赋值给Unpickler

1.0.2 (2018-08-10)

  • 添加对Python 3.7的支持。

1.0.1 (2018-05-16)

  • 修复Python 2下pickle协议3的内存泄漏问题。请参阅问题36

1.0 (2018-02-09)

  • 在readme中添加警告,不要使用不受信任的pickle。

  • 停止支持Python 3.3。

0.7.0 (2017-09-22)

  • 停止支持Python 2.6和3.2。

  • 添加对Jython 2.7的支持。

  • 添加对Python 3.5和3.6的支持。

0.6.0 (2015-04-02)

  • 从Python 2.6恢复noload行为,并在PyPy和Python 2下的非C加速unpickler上提供noload方法。

  • 添加对PyPy、PyPy3和Python 3.4的支持。

0.5.2 (2013-08-17)

0.5.1 (2013-07-06)

  • 将所有代码和测试更新到Python 2.6.8、2.7.5、3.2.5和3.3.2。

  • 添加模块zodbpickle.fastpicklezodbpickle.slowpickle。这提供了一个C或Python实现的版本无关选择。

  • 修复OS X上的一个小的错误。

0.5.0 (2013-06-14)

  • 从pickle API中移除对bytes_as_strings参数的支持:当该参数为true时创建的pickle可能无法在未传递encoding='bytes'的情况下解pickle,ZODB无法可靠地强制执行。在Py3k上,ZODB将使用protocol=3的pickle。

0.4.4 (2013-06-07)

  • 将协议3操作码添加到C版本的noload()分发器。

0.4.3 (2013-06-07)

  • 打包错误:从sdist中移除多余的-ASIDE文件。

0.4.2 (2013-06-07)

  • 修复纯Python版本中的Unpickler.noload_appends中的NameError。

  • 修复纯Python版本中的Unpickler.noload_setitems中的NameError。

0.4.1 (2013-04-29)

  • 修复Python 2版本的zodbpickle.pickle模块中的拼写错误。

0.4 (2013-04-28)

  • 支持Python 2.6、2.7、3.2和3.3的常见pickle模块接口。

  • 将Python实现/测试分成Python2和Py3k特定变体。

  • 添加Python 2.7的_pickle.c的分支,用于在Python 2下使用。该分支增加了对Py3k protocol 3操作码的支持。

  • 为Python 2应用程序添加自定义binary类型。从bytes派生,binary类型允许Python 2应用程序使用操作码将二进制数据pickle为在Py3k上解pickle为bytes。在Py3k下,binary类型只是bytes的别名。

0.3 (2013-03-18)

  • 为Python 3.2版本的Unpickler添加了noload代码。与Python 3.3版本一样,此代码尚未测试。

  • 为Python 3.2版本的Picklerdumpdumps添加了bytes_as_strings选项。

0.2 (2013-03-05)

  • bytes_as_strings 选项添加到 Picklerdumpdumps

  • 对 Python 3.2 的支持不完整。

    • _pickle.c 重命名为 _pickle_33.c

    • 复制 Python 3.2.3 的 _pickle.c_pickle_32.c 并应用相同的补丁。

    • 根据 sys.version_info 在构建时选择它们。

    • 禁用了一些仅适用于 3.3 的功能的测试。

    • 缺少:在 _pickle_32.c 中实现 noload()

    • 缺少:在 _pickle_32.c 中实现 bytes_as_strings=True

0.1.0 (2013-02-27)

  • Python 3.3 的 pickle 的初始发布,应用了 Python issue 6784 的补丁。

  • 添加了对 errors="bytes" 的支持。

项目详情


下载文件

下载适合您平台的项目文件。如果您不确定该选择哪个,请了解更多关于 安装包 的信息。

源代码分发

zodbpickle-4.1.1.tar.gz (117.6 kB 查看哈希值)

上传时间 源代码

构建分发

zodbpickle-4.1.1-cp313-cp313-win_amd64.whl (142.6 kB 查看哈希值)

上传时间 CPython 3.13 Windows x86-64

zodbpickle-4.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (305.9 kB 查看哈希值)

上传时间 CPython 3.13 manylinux: glibc 2.17+ x86-64

zodbpickle-4.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (306.6 kB 查看哈希值)

上传时间 CPython 3.13 manylinux: glibc 2.17+ ARM64

zodbpickle-4.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (302.9 kB 查看哈希值)

上传于 CPython 3.13 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zodbpickle-4.1.1-cp313-cp313-macosx_11_0_arm64.whl (140.6 kB 查看哈希)

上传于 CPython 3.13 macOS 11.0+ ARM64

zodbpickle-4.1.1-cp313-cp313-macosx_10_9_x86_64.whl (141.8 kB 查看哈希)

上传于 CPython 3.13 macOS 10.9+ x86-64

zodbpickle-4.1.1-cp312-cp312-win_amd64.whl (142.6 kB 查看哈希)

上传于 CPython 3.12 Windows x86-64

zodbpickle-4.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (305.0 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ x86-64

zodbpickle-4.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (305.8 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ ARM64

zodbpickle-4.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (302.5 kB 查看哈希)

上传于 CPython 3.12 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zodbpickle-4.1.1-cp312-cp312-macosx_11_0_arm64.whl (140.5 kB 查看哈希)

上传于 CPython 3.12 macOS 11.0+ ARM64

zodbpickle-4.1.1-cp312-cp312-macosx_10_9_x86_64.whl (141.8 kB 查看哈希)

上传于 CPython 3.12 macOS 10.9+ x86-64

zodbpickle-4.1.1-cp311-cp311-win_amd64.whl (142.2 kB 查看哈希)

上传于 CPython 3.11 Windows x86-64

zodbpickle-4.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (299.5 kB 查看哈希)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64

zodbpickle-4.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (299.8 kB 查看哈希)

上传于 CPython 3.11 manylinux: glibc 2.17+ ARM64

zodbpickle-4.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (296.3 kB 查看哈希)

上传于 CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zodbpickle-4.1.1-cp311-cp311-macosx_11_0_arm64.whl (140.6 kB 查看哈希)

上传于 CPython 3.11 macOS 11.0+ ARM64

zodbpickle-4.1.1-cp311-cp311-macosx_10_9_x86_64.whl (141.8 kB 查看哈希)

上传于 CPython 3.11 macOS 10.9+ x86-64

zodbpickle-4.1.1-cp310-cp310-win_amd64.whl (141.7 kB 查看哈希)

上传于 CPython 3.10 Windows x86-64

zodbpickle-4.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (284.1 kB 查看哈希)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64

zodbpickle-4.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (284.8 kB 查看哈希)

上传于 CPython 3.10 manylinux: glibc 2.17+ ARM64

zodbpickle-4.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (281.1 kB 查看哈希)

上传于 CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zodbpickle-4.1.1-cp310-cp310-macosx_11_0_arm64.whl (140.6 kB 查看哈希)

上传于 CPython 3.10 macOS 11.0+ ARM64

zodbpickle-4.1.1-cp310-cp310-macosx_10_9_x86_64.whl (141.8 kB 查看哈希值)

上传时间: CPython 3.10 macOS 10.9+ x86-64

zodbpickle-4.1.1-cp39-cp39-win_amd64.whl (141.6 kB 查看哈希值)

上传时间: CPython 3.9 Windows x86-64

zodbpickle-4.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (282.3 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.17+ x86-64

zodbpickle-4.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (282.9 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.17+ ARM64

zodbpickle-4.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (279.7 kB 查看哈希值)

上传时间: CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zodbpickle-4.1.1-cp39-cp39-macosx_11_0_arm64.whl (140.5 kB 查看哈希值)

上传时间: CPython 3.9 macOS 11.0+ ARM64

zodbpickle-4.1.1-cp39-cp39-macosx_10_9_x86_64.whl (141.5 kB 查看哈希值)

上传时间: CPython 3.9 macOS 10.9+ x86-64

zodbpickle-4.1.1-cp38-cp38-win_amd64.whl (141.9 kB 查看哈希值)

上传时间: CPython 3.8 Windows x86-64

zodbpickle-4.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (288.8 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ x86-64

zodbpickle-4.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (288.7 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ ARM64

zodbpickle-4.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (285.8 kB 查看哈希值)

上传时间: CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

zodbpickle-4.1.1-cp38-cp38-macosx_11_0_arm64.whl (140.4 kB 查看哈希值)

上传时间: CPython 3.8 macOS 11.0+ ARM64

zodbpickle-4.1.1-cp38-cp38-macosx_10_9_x86_64.whl (141.5 kB 查看哈希值)

上传时间: CPython 3.8 macOS 10.9+ x86-64

支持者