如何找出/打印生成pickle文件的协议版本

Jac*_*oge 6 python pickle

在某些情况下,当我加载一个现有的 pickle 文件,然后再次转储它时,大小几乎减半。

我想知道为什么,第一个怀疑是协议版本。我可以以某种方式找出文件被腌制的协议版本吗?

use*_*968 5

可能有一种更优雅的方式,但要深入了解您可以使用的金属pickletools

import pickle
import pickletools
s = pickle.dumps('Test')
proto_op = next(pickletools.genops(s))
assert proto_op[0].name == 'PROTO'
proto_ver = proto_op[1]
Run Code Online (Sandbox Code Playgroud)

要确定解码所需的版本,您需要每个操作码的最大协议版本:

proto_ver = max(op[0].proto for op in pickletools.genops(s))
Run Code Online (Sandbox Code Playgroud)