pickletools — pickle 开发人员的工具 — Python 文档

来自菜鸟教程
Python/docs/3.9/library/pickletools
跳转至:导航、​搜索

pickletools — pickle 开发人员的工具

源代码: :source:`Lib/pickletools.py`



该模块包含与 pickle 模块的私密细节相关的各种常量、一些关于实现的冗长评论,以及一些用于分析pickle 数据的有用函数。 该模块的内容对于正在研究 pickle 的 Python 核心开发人员很有用; pickle 模块的普通用户可能不会发现 pickletools 模块相关。

命令行使用

3.2 版中的新功能。


当从命令行调用时,python -m pickletools 将反汇编一个或多个 pickle 文件的内容。 请注意,如果您想查看pickle 中存储的Python 对象而不是pickle 格式的详细信息,则可能需要使用-m pickle 代替。 但是,当您要检查的 pickle 文件来自不受信任的来源时,-m pickletools 是一个更安全的选择,因为它不执行 pickle 字节码。

例如,使用文件 x.pickle 中腌制的元组 (1, 2)

$ python -m pickle x.pickle
(1, 2)

$ python -m pickletools x.pickle
    0: \x80 PROTO      3
    2: K    BININT1    1
    4: K    BININT1    2
    6: \x86 TUPLE2
    7: q    BINPUT     0
    9: .    STOP
highest protocol among opcodes = 2

命令行选项

-a, --annotate
用简短的操作码描述注释每一行。
-o, --output=<file>
应写入输出的文件的名称。
-l, --indentlevel=<num>
缩进新 MARK 级别的空格数。
-m, --memo
当多个对象被拆卸时,在拆卸之间保留备忘录。
-p, --preamble=<preamble>
当指定了多个泡菜文件时,在每次反汇编之前打印给定的序言。


编程接口

pickletools.dis(pickle, out=None, memo=None, indentlevel=4, annotate=0)

将泡菜的符号反汇编输出到类似文件的对象 out,默认为 sys.stdoutpickle 可以是字符串或类似文件的对象。 memo 可以是一个 Python 字典,将用作泡菜的备忘录; 它可用于跨由同一pickler 创建的多个pickle 执行反汇编。 流中由 MARK 操作码指示的连续级别由 indentlevel 空格缩进。 如果将非零值赋予 annotate,则输出中的每个操作码都带有简短描述的注释。 annotate 的值用作注释应该开始的列的提示。

3.2 新功能:annotate 参数。

pickletools.genops(pickle)
在泡菜中的所有操作码上提供 迭代器 ,返回 (opcode, arg, pos) 三元组的序列。 opcode 是一个 OpcodeInfo 类的实例; arg 是作为 Python 对象的操作码参数的解码值; pos是这个操作码所在的位置。 pickle 可以是字符串或类似文件的对象。
pickletools.optimize(picklestring)
消除未使用的 PUT 操作码后,返回一个新的等效 pickle 字符串。 优化后的腌渍时间更短,传输时间更短,需要的存储空间更小,脱腌效率更高。