python 2和3 pickle模块的fork。
zodbpickle的Python项目详细描述
zodbpickle 自述文件
此软件包为zodb提供了一个统一的酸洗界面:
- 在python2下,这个包派生python2.7的pickle和 cpickle 模块,增加了对 协议3 操作码的支持。 它还提供了一个新的子类 bytes , zodbpickle.binary , 哪些python2应用程序可以用来pickle二进制值,以便 在PY3K下,它们将作为 字节被取消勾选。
- 在py3k下,这个包派生出pickle模块(以及支持 c扩展)来自python 3.2和python3.3。叉子加支撑 对于zodb使用的 空载 操作。
小心
zodbpickle 依赖于python的 pickle 模块。 pickle 模块不是用来防止错误或 恶意构建的数据。从不解除从 可能会执行不受信任或未经身份验证的源作为任意代码。
另请参见https://docs.python.org/3.6/library/pickle.html" rel="nofollow">https://docs.python.org/3.6/library/pickle.html
一般用法
要获得python 2和3 pickling之间的兼容性,请替换:
import pickle<>
from zodbpickle import pickle
这提供了兼容性,但其效果是您可以快速实现 在Python3中,Python2使用慢速版本。
要获得更确定的实现选择,请使用以下选项之一:
from zodbpickle import fastpickle # always C from zodbpickle import slowpickle # always Python
两个模块可以共存,这有助于进行比较。
但是还有一些需要考虑,所以请继续阅读!
加载/存储python 2字符串
python开发人员用他们所有的智慧决定python 2 str 实例应加载为python 3 str 对象(即unicode 字符串)python中提出了补丁程序,但从来没有 应用。此代码库包含这些修补程序。
示例1:在Python3上加载Python2 pickle
$ 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:在Python2上加载Python3 pickle
$ 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'}
>>> 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使用 cpickle 's noload() 方法来检索所有持久的 雷弗不加载任何对象从pickle中提取的碎片。此功能已删除 来自python 3的pickle。不幸的是,这不必要地填满了泡菜 缓存. < /P>
此模块再次提供一个 noload() 方法。