python 2和3 pickle模块的fork。

zodbpickle的Python项目详细描述


zodbpickle 自述文件

https://travis-ci.org/zopefoundation/zodbpickle.svg?branch=master覆盖状态pypipython versions

此软件包为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'}
编码='ascii'
(默认值)和 错误='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使用 cpickle 's noload() 方法来检索所有持久的 雷弗不加载任何对象从pickle中提取的碎片。此功能已删除 来自python 3的pickle。不幸的是,这不必要地填满了泡菜 缓存. < /P>

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

更改日志

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java组织。openqa。硒。遥远的UnreachableBrowserException如何定义EXE路径?   java Camel AdviceWith不使用指定文件替换端点   基于字符串的java图像加载   Java中的启发式算法,计算8个谜题状态的线性冲突   java为什么不支持文件。probeContentType返回null   JPA@EntityListeners、@PrePersist和Spring@RepositoryEventHandler、@HandleBeforeSave之间的java差异   可能前缀的Java字符串到字符串[]   安装rJava | Makefile时发生java错误。全部:38:target’libjri的配方。所以他失败了   Java公共静态void main()   java如何覆盖txt文件中的某些单词   java如何获得循环中生成的字符值之和?   java Log4j创建另一个具有相同属性的appender   java如何在从Axis2 Web服务客户端通过代理服务器调用Web服务时设置代理设置?   在Windows上安装Elasticsearch时发生java错误   java如何向EditText组件添加TextChangedListener?