一种康复的、不那么危险的腌菜。
pikl的Python项目详细描述
pikl自述文件
此包试图创建已修复的pickle模块:
- 已删除全局和INST操作码。copyreg扩展注册表是 作为转储或加载自定义类的唯一(opt-in)机制。
- 已删除协议0和1支持。只接受二进制泡菜。
- protocol 3是python 2.x和python3.x上的默认协议
pikl派生自zodbpickle,这是zodb的统一pickling接口。
注意
pikl最终派生自python的pickle模块。 尽管已经努力消除已查明的安全漏洞, 几乎可以肯定的是,仍然存在更多的伤害。
pickle模块不是用来防止错误或 恶意构建的数据。从不解除从 可能会执行不受信任或未经身份验证的源作为任意代码。
一般用法
要使用pikl而不是python的内置pickle模块,请替换:
import pickle
签署人:
import pikl.pickle as pikl
这提供了兼容性,但其效果是您可以快速实现 在Python3中,Python2使用慢速版本。
要获得更确定的实现选择,请使用以下选项之一:
import pikl.fastpickle as pikl # always C import pikl.slowpickle as pikl # always Python
由pickle生成的bytestream可以由pikl加载,前提是 满足某些限制(例如,协议>;=2,不使用全局操作码):
$ python3 >>> import pickle >>> s = pickle.dumps({'abc': 2}) >>> from pikl import pickle as pikl >>> pikl.loads(s) {'abc': 2}
加载早期协议将引发UnpicklingError:
>>> s = pickle.dumps({'abc': 2}, protocol=0) >>> pikl.loads(s) Traceback (most recent call last): ... pikl.pickle_3.UnpicklingError: Only binary pickle protocols are supported
加载未注册的类或可调用的类将引发UnpicklingError:
>>> s = pickle.dumps(complex(2, 1)) >>> pikl.loads(s) Traceback (most recent call last): ... pikl.pickle_3.UnpicklingError: GLOBAL opcode is not supported
扩展注册表
提供用于加载类或可调用项的opt-in机制pikluses copyreg模块中的扩展注册表:
>>> import copyreg >>> copyreg.add_extension('builtins', 'complex', 240) >>> s = pickle.dumps(complex(2, 1)) >>> pikl.loads(s) (2+1j)
pickler和unpickler必须在相同的注册表代码上达成一致。未来 pikl的版本将包括一个机制(例如定义的配置文件)来实现这一点 协助。
更改日志
0.0.1(2018-09-26)
- 从Zodbpickle 1.0.3中分叉
- 删除对pickle协议0和1的支持
- 拆下对DUP操作码的支持
- 删除对全局操作码的支持
- 拆下INST操作码支架
- 添加pickle.lowest_protocol和cpickle.lowest_protocol常量