鉴于 python 中的泡菜转储,我如何确定使用的协议?

SmC*_*lar 7 python pickle

假设我有一个泡菜转储——无论是作为一个文件还是一个字符串——我如何确定用于自动创建泡菜转储的协议?

如果是这样,我是否需要阅读整个转储来找出协议,还是可以在 O(1) 中实现?通过 O(1),我考虑了 pickle 字符串或文件开头的一些标头信息,其读出不需要处理整个转储。

非常感谢!

编辑:我对此有一个更新,显然下面给出的答案在python 3.4下并不总是有效。如果我只是True用协议 1腌制值,有时我只能恢复协议 0 :-/

Jon*_*nts 5

您可以使用picketools以下方法推出自己的产品:

with open('your_pickle_file', 'rb') as fin:
    op, fst, snd = next(pickletools.genops(fin))
    proto = op.proto
Run Code Online (Sandbox Code Playgroud)

似乎 PROTO 标记只写为协议为 2 或更大的第一个元素。否则,第一个元素是一个标记或元素,指示协议是 0 还是 1。

更新到拼凑更多土地:

pops = pickletools.genops(pickle_source)
proto = 2 if next(pops)[0].proto == 2 else int(any(op.proto for op, fst, snd in pops))
Run Code Online (Sandbox Code Playgroud)